Может ли autofac сделать частичное разрешение? - PullRequest
6 голосов
/ 07 июня 2011

Мне, похоже, это очень нужно.

Допустим, у меня есть класс с конструктором, принимающим несколько аргументов. Некоторые из них могут быть решены путем регистрации компонентов. Но остальные - это экземпляры, созданные во время выполнения (например, выборка объекта из базы данных).

Может ли Autofac хорошо справиться с этими ситуациями? Или мой дизайн неоптимальный?

Чтобы уточнить, у меня есть классы, у которых есть конструкторы, подобные этому:

public MyClass(IService1 service1, IService2 service2, Data1 data1, Data2 data2)
{
//...
}

И я хотел бы сделать что-то вроде этого:

container.Resolve<MyClass>(data1, data2);

Ответы [ 2 ]

10 голосов
/ 07 июня 2011

Вы можете сделать это элегантно, зарегистрировав фабричный метод в контейнере Autofac.Вы разрешаете фабричный метод, а затем используете его для создания экземпляров с вашими зависимостями времени выполнения.Вы можете сделать это самостоятельно, зарегистрировав и решив делегатов или пользовательских типов фабрики.Однако Autofac явно поддерживает фабрики делегатов .

Недостаточно информации, чтобы прокомментировать ваш дизайн.Я оставлю это вам:)

3 голосов
/ 07 июня 2011

Я бы сказал, что ваш дизайн ниже оптимального.

Вы, кажется, смешиваетесь с вещами. Внедрение зависимостей (с использованием контейнера) должно в основном использоваться для введения сервисных компонентов в другие компоненты. Не вводите такие вещи, как сущности, потому что это не зависит от контейнера, чтобы управлять их временем жизни. Скорее, введите сервис, который может управлять объектами для вас, например, хранилище . Хотя это и тема обсуждения, я бы не стал вводить единицу работы, а скорее фабрику для создания единицы работы . Таким образом, ваше приложение явно управляет временем жизни единицы работы.

...