2010-12-02 4 views
2

Можно ли сделать единство попробовать все определенные конструкторы, начиная с одного с большинством аргументов до наименее специфического (конструктор по умолчанию)?Единство и конструкторы

Редактировать

Что я имею в виду:

foreach (var constructor in concrete.GetConstructorsOrderByParameterCount()) 
{ 
    if(CanFulfilDependencies(constructor)) 
    { 
     UseConstructor(constructor); 
     break; 
    } 
} 

Я не хочу единства только попробовать конструктор большинства параметров. Я хочу, чтобы он продолжал попытки, пока не найдет подходящий конструктор. Если Unity не предоставляет такое поведение по умолчанию, возможно ли создать расширение или что-то, что можно сделать?

Edit 2

Я получил класс с двумя конструкторами:

public class MyConcrete : ISomeInterface 
{ 
    public MyConcrete (IDepend1 dep, IDepend2 dep2) 
    {} 

    public MyConcrete(IDepend1 dep) 
    {} 
} 

класс в библиотеке, которая используется несколькими проектами существует. В этом проекте я хочу использовать второй конструктор. Но Unity останавливается, так как он не может выполнить зависимости первым конструктором. И я не хочу изменить класс, так как первый конструктор используется DI в других проектах.

Следовательно, необходимо, чтобы Unity попыталась разрешить все конструкторы.

+1

Что именно вы подразумеваете под «попыткой»? – 2010-12-02 14:53:48

+0

Снова ... вы говорите «подходящий» ... просьба указать код, в котором эта проблема всплывает, поскольку это может сделать вещи более ясными. Конструкторы не должны вообще зависеть от внешних объектов вне того, что передается, не должны выбрасывать исключения и т. Д. ... Редактировал мой ответ, однако ... – 2010-12-02 15:21:57

ответ

3

Unity выберет конструктор с наибольшим количеством параметров, если вы явно не пометьте конструктор атрибутом [InjectionConstructor], который затем определит конструктор для использования Unity.

Когда вы указываете подходящий конструктор; что несколько зависит от окружающей среды. Если, например, вы всегда хотите гарантировать, что определенный конструктор используется при использовании Unity, используйте атрибут, упомянутый ранее, иначе явным образом вызываю конструктор, который вы хотите использовать.

Какой смысл Unity «пробовать» все конструкторы? Цель состоит в том, чтобы предоставить экземпляр типа развязанным образом. Зачем он перебирает конструкторы, если какой-либо конструктор создаст экземпляр типа?

EDIT:

Вы могли бы позволить конструктор с наибольшим количеством Params, которые будут использоваться в рамках проекта, который не имеет ссылку на этот тип в своем контейнере путем использования в child container. Это не приведет к принудительному использованию конструктора с одним параметром, но теперь позволит конструктору с двумя параметрами работать над проектами.

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

Смежные вопросы