Единство и конструкторы
Можно ли сделать так, чтобы единство пробовало все определенные конструкторы, начиная с одного с большинством аргументов, вплоть до наименее определенного (конструктор по умолчанию)?
редактировать
Что я имею в виду:
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... поэтому база применима ко всем проектам, что будет иметь больше смысла.