Есть ли способ указать, какой конструктор следует использовать Unity?

#.net #dependency-injection #inversion-of-control #unity-container #constructor-injection

#.net #внедрение зависимостей #инверсия управления #unity-контейнер #конструктор-инъекция

Вопрос:

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

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

Комментарии:

1. Я не знаю, что вы можете сделать что-то подобное напрямую, но, возможно, вы могли бы получить результат от InjectionConstructor и переопределить его AddPolicies метод?

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

3. @Steven — полностью согласен. На самом деле у меня есть только один в этом случае. Я думаю, что увеличение было неправильным словом. Возможно, сказать, что мне нужно что-то среднее между явным ( InjectionConstructor ) и неявным (не используемым InjectionConstructor вообще), имеет больше смысла.

Ответ №1:

Комментарий Марка послужил основой для ответа. А именно, реализация AddPolicies

  • должен найти конструктор, который соответствует всем значениям (явным) Я перехожу в конструктор InjectionConstructor . Существуют ограничения (например, если значения равны нулю или они сопоставляются с супертипом в конструкторе), и
  • для оставшихся (неявных) используйте контейнер для их разрешения.

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