Как добавить фабрику универсальных типов с помощью Autofac - PullRequest
5 голосов
/ 12 марта 2012

У меня есть фабрика репозиториев NhRepositoryFactory

public interface IRepositoryFactory  
{  
  IRepository<T> Create<T>() where T: Entity;  
} 

public class NhRepositoryFactory: IRepositoryFactory  
{  
  public IRepository<T> Create<T>() where T : Entity  
  {  
    return new NhRepository<T>();  
  }  
}

Чтобы разрешить некоторые зависимости репозиториев, я хочу получить их из контейнера Autofac.Так что я должен каким-то образом ввести фабрику Func<IRepository<T>> в свой класс.Как мне это сделать?
Заранее спасибо.

Ответы [ 2 ]

6 голосов
/ 12 марта 2012

NhRepositoryFactory не содержит бизнес-логики и может быть частью вашего корня композиции. Это позволяет вам иметь ссылку на контейнер. Это просто механика и не считается анти-паттерном сервисного локатора. NhRepositoryFactory будет выглядеть так:

// This class is part of your composition root
public class NhRepositoryFactory : IRepositoryFactory  
{
    private readonly Container container;

    public NhRepositoryFactory(Container container)
    {
        this.container = container;
    }

    public IRepository<T> Create<T>() where T : Entity  
    {  
        return this.container.Resolve<NhRepository<T>>();
    }  
}

И вы можете зарегистрировать это так:

builder.Register<IService>(c => new NhRepositoryFactory(c))
    .SingleInstance();
5 голосов
/ 12 марта 2012

Autofac также может обрабатывать родовое создание без фабричной обработки.

builder.RegisterGeneric(typeof(NhRepository<>))
    .As(typeof(IRepository<>))
    .InstancePerLifetimeScope();

Используя этот шаблон, вы можете просто получить зависимость от IRepository, и autofac заполнит зависимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...