Разрешить зависимость с помощью autofac на основе атрибута параметра конструктора - PullRequest
4 голосов
/ 19 марта 2010

Я использую Autofac. Я хочу внедрить другую реализацию зависимости, основанную на атрибуте, который я применяю к параметру конструктора. Например:

class CustomerRepository
{
    public CustomerRepository([CustomerDB] IObjectContainer db) { ... }
}

class FooRepository
{
    public FooRepository([FooDB] IObjectContainer db) { ... }
}

builder.Register(c => /* return different instance based on attribute on the parameter */)
       .As<IObjectContainer>();

Атрибуты будут предоставлять данные, такие как строка соединения, которую я могу использовать для создания экземпляра правильного объекта.

Как я могу это сделать?

Ответы [ 2 ]

9 голосов
/ 21 марта 2010

Похоже, вы хотите предоставить различные реализации от IObjectContainer до CustomerRepository и FooRepository. Если это так, атрибуты могут быть тонкая металлическая линейка . Вместо этого я покажу вам, как реализовать несколько реализаций с помощью Autofac.

(Такие вызовы, как .ContainerScoped() были опущены для краткости.)

Сначала зарегистрируйте версию IObjectContainer для каждой строки подключения, указав регистрацию:

builder
    .Register(c => new ObjectContainer(ConnectionStrings.CustomerDB))
    .As<IObjectContainer>()
    .Named("CustomerObjectContainer");

builder
    .Register(c => new ObjectContainer(ConnectionStrings.FooDB))
    .As<IObjectContainer>()
    .Named("FooObjectContainer");

Затем разрешите конкретные экземпляры в регистрациях репозитория:

builder.Register(c => new CustomerRepository(
    c.Resolve<IObjectContainer>("CustomerObjectContainer"));

builder.Register(c => new FooRepository(
    c.Resolve<IObjectContainer>("FooObjectContainer"));

В результате в хранилищах не будет информации о конфигурации:

class CustomerRepository
{
    public CustomerRepository(IObjectContainer db) { ... }
}

class FooRepository
{
    public FooRepository(IObjectContainer db) { ... }
}
0 голосов
/ 28 сентября 2013

Ответ Брайана достаточно хорош, пока у вас есть несколько репозиториев, и у них мало параметров конструктора. Но трудно установить свой рут, когда у вас их много. Вы можете достичь этого путем сканирования метаданных вашего класса при разрешении интерфейса. Когда вы получите информацию о его параметрах, вы можете решить фактическую реализацию. Смотрите мой ответ здесь .

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