Может ли autofac выполнять частичное разрешение?

Кажется, мне это очень нужно.

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

Сможет ли Autofac справиться с такими ситуациями? Или мой дизайн неоптимален?

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

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

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

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


person Kugel    schedule 07.06.2011    source источник
comment
Связано: stackoverflow.com/questions/4835046/.   -  person Steven    schedule 07.06.2011


Ответы (2)


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

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

person Steven    schedule 07.06.2011
comment
Я не внедряю сущности. У меня есть только классы, которым требуются службы, а также конкретные экземпляры данных. - person Kugel; 08.06.2011
comment
Попробуйте в этом случае разделить данные и поведение. Не используйте внедрение конструктора для внедрения объектов данных (DTO) в службы и не внедряйте службы в DTO. Просто возвращайте DTO из сервисов или вызывайте методы сервиса, используя DTO. - person Steven; 08.06.2011
comment
Итак, вы предполагаете, что классы являются либо услугами, либо объектами данных? - person Kugel; 08.06.2011
comment
Как я уже сказал, вопрос о том, следует ли внедрять единицу работы или репозиторий, является предметом обсуждения. Я написал этот ответ два года назад и с тех пор передумал. Для приложений, которые я создаю прямо сейчас, мне удобнее вводить единицу работы напрямую, как я выразился в этот ответ stackoverflow. - person Steven; 29.09.2013
comment
Спасибо за исправление вашего ответа. Я должен отметить, что, когда я разместил этот вопрос, я имел дело с приложением WPF с отслеживанием состояния, что не очень хорошо для начала с IoC, потому что в ответ на действия пользователя во время выполнения создается много объектов. В конце концов я справился с этим, используя перегрузку BeginLifeTimeScope, которая требует дополнительной настройки. У меня было 3 или 4 вложенных области, которые были настроены с дополнительными услугами по запросу. - person Kugel; 30.09.2013

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

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

person bentayloruk    schedule 07.06.2011