Единство и конструкторы - PullRequest
       16

Единство и конструкторы

2 голосов
/ 02 декабря 2010

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

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

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

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

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

Изменить 2

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

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

    public MyConcrete(IDepend1 dep)
    {}
}

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

Следовательно, Unity должна попытаться разрешить все конструкторы.

1 Ответ

3 голосов
/ 02 декабря 2010

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

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

Какой смысл Unity "пробовать" всех конструкторов? Его целью является предоставление экземпляра типа в отсоединенном виде. Зачем выполнять итерацию по конструкторам, если какой-либо конструктор создаст экземпляр типа?

EDIT:

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

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

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