Как создавать объекты, используя статический фабричный метод? - PullRequest
30 голосов
/ 28 сентября 2011

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

container.RegisterType<IAuthoringRepository, AuthoringRepository>();

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

Ответы [ 2 ]

49 голосов
/ 28 сентября 2011

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

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

Кроме того, вы можете указать делегата с 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 .

0 голосов
/ 29 марта 2019

Теперь метод InjectionFactory устарел. Поэтому лучше использовать метод RegisterFactory. Ниже я показываю, как изменился предыдущий код. Как видите, я изменил метод CreateAuthoringRepository. Теперь это метод static с одним параметром Контейнер IUnityContainer

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

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

public static IAuthoringRepository CreateAuthoringRepository(IUnityContainer container)
{
    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; }
}
...