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

StackOverflow https://stackoverflow.com/questions/2470102

Вопрос

Учитывая класс с несколькими конструкторами, как я могу указать Resolve, какой конструктор использовать?

Рассмотрим следующий пример класса:

public class Foo
{
    public Foo() { }
    public Foo(IBar bar)
    {
        Bar = bar;
    }
    public Foo(string name, IBar bar)
    {
        Bar = bar;
        Name = name;
    }
    public IBar Bar { get; set; }        
    public string Name { get; set; }
}

Если я хочу создать объект типа Foo с помощью Resolve, как Resolve узнает, какой конструктор использовать?И как я могу сказать ему, чтобы он использовал правильный?Допустим, у меня есть контейнер с зарегистрированным IBar - поймет ли он, что он должен отдавать предпочтение конструктору, принимающему IBar?И если я тоже укажу строку - будет ли она использовать (string, IBar) конструктор?

Foo foo = unityContainer.Resolve<Foo>(); 

И, пожалуйста, не обращайте внимания на тот факт, что, вероятно, было бы проще, если бы у класса был только один конструктор...

Это было полезно?

Решение

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

Взято из текст ссылки

Другие советы

Когда вы регистрируете тип, вы можете указать, какой конструктор использовать, следующим образом:

container.RegisterType<Foo>(
    new InjectionConstructor(
        new ResolvedParameter<IBar>()));

Приведенный выше код взят из памяти, но это общий принцип.В данном случае я выбрал конструктор, принимающий один параметр типа IBar.

И, пожалуйста, не обращайте внимания на тот факт, что, вероятно, было бы проще, если бы у класса был только один конструктор...

Я не могу игнорировать это.Когда дело доходит до внедрения в конструктор, двусмысленность это дизайнерский запах.Вы по сути говорите: Я действительно не знаю, волнует ли меня эта зависимость или нет.

Конечно, Unity, скорее всего, выяснит это за вас, но тогда вам придется полагаться на конкретное поведение контейнера вместо того, чтобы правильно проектировать свой API. Другие контейнеры могут иметь другое поведение., поэтому, если вы когда-нибудь решите перейти с Unity на более качественный контейнер, могут возникнуть незначительные ошибки.

Гораздо безопаснее писать код в Дружественный к DI, но не зависящий от контейнера образом.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top