Подтвердить что ты не робот

Как создать объекты с помощью статического метода factory?

Я знаю, что Unity может быть настроен на использование конструктора класса для создания экземпляра класса (например, ниже), но это не то, что я хочу.

container.RegisterType<IAuthoringRepository, AuthoringRepository>();

Я хотел бы настроить Unity для использования метода factory с идентификатором Windows, переданным как параметр (т.е. RepositoryFactory.CreateAuthoringRepository(WindowsIdentity.GetCurrent())) при разрешении типа IAuthoringRepository. Как это сделать?

4b9b3361

Ответ 1

Один из способов заключается в том, чтобы RepositoryFactory реализовал IRepositoryFactory, а затем зарегистрировал это. Решенные типы могут получить factory, а затем вызвать метод CreateAuthoringRepository. Вы можете создать перегрузку с именем CreateAuthoringRepositoryForCurrentIdentity, если хотите, или зарегистрировать зависимость IIdentity от factory с Unity.

Я бы просто ввел factory и оставил метод CreateAuthoringRepository таким, какой у вас есть, а затем клиенты передают WindowsIdentity.GetCurrent(). Таким образом, идентификация всегда свежая, и вы можете высмеивать factory для тестирования.

В качестве альтернативы вы можете указать делегата с InjectionFactory:

void Main()
{
    using (var container = new UnityContainer())
    {
        container.RegisterType<IAuthoringRepository>(
            new InjectionFactory(c => CreateAuthoringRepository()));

        Console.WriteLine("debug - resolving model");
        var model = container.Resolve<Model>();
    }
}

public IAuthoringRepository CreateAuthoringRepository()
{
    Console.WriteLine("debug - calling factory");
    return new AuthoringRepository
        { Identity = WindowsIdentity.GetCurrent() };
}

public class Model
{
    public Model(IAuthoringRepository repository)
    {
        Console.WriteLine(
            "Constructing model with repository identity of "
            + repository.Identity);
    }
}

public interface IAuthoringRepository
{
    IIdentity Identity { get; }
}

public class AuthoringRepository : IAuthoringRepository
{
    public IIdentity Identity { get; set; }
}

Отпечатки:

debug - resolving model
debug - calling factory
Constructing model with repository identity of System.Security.Principal.WindowsIdentity

Что для Unity 2.0. С более ранними версиями см. StaticFactoryExtension.