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

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

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

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

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 ответ

Решение

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

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

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

РЕДАКТИРОВАТЬ:

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

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

Другие вопросы по тегам