Укажите конструктора для Единицы контейнер МОК для использования

Я использую Единицу контейнер МОК для разрешения моих объектов. Однако я столкнулся с проблемой. Когда у меня есть больше чем один конструктор - как Единица знает который использовать? Это, кажется, использует тот с параметрами, когда я имею один с и один без. Я могу явно сказать это который конструктор использовать?

Конкретно у меня был случай, подобный следующему классу Человека с двумя конструкторами. В этом случае я хочу, чтобы контейнер МОК использовал конструктора по умолчанию - без параметров - но он выбирает тот с параметрами.

public class SomeValueObject
{
    public SomeValueObject(string name)
    {
        Name = name; 
    }
    public string Name { get; set; }
}

public class Person
{
    private string _name; 

    public Person()
    {
        _name = string.Empty;
    }

    public Person(SomeValueObject obj)
    {
        _name = obj.Name;
    }
}

Это, очевидно, перестало работать, поскольку это не может создать SomeValueObject - не знающий, что ввести к его строковому параметру. Ошибка, которую это дает:

Разрешение зависимости перестало работать, введите = "MyApp. Человек", называют = "". Сообщение об исключении: текущая операция сборки (создают ключевой Ключ Сборки [MyApp. Человек, пустой указатель]), перестал работать: параметр obj не мог быть разрешен при попытке назвать конструктора MyApp. Человек (MyApp. SomeValueObject obj). (Тип стратегии BuildPlanStrategy, индекс 3)

Контейнерная регистрация:

Container.RegisterType<Person, Person>(new Microsoft.Practices.Unity.ContainerControlledLifetimeManager());

И разрешение:

var person = Container.Resolve<Person>();
42
задан John Farrell 25 March 2010 в 16:54
поделиться

4 ответа

Зарегистрируйте это, как это так:

container.RegisterType<Person>(new InjectionConstructor());

Вы можете добавить LifetImeManager, используя перегрузку метода RegisterType.

Это сказано, что при моделировании DI, ваша жизнь будет намного проще, если у вас есть однозначные контракции (то есть нет перегруженных конструкторов).

50
ответ дан 26 November 2019 в 23:43
поделиться

По умолчанию Unity выбирает конструктор с максимальным количеством аргументов. Чтобы переопределить это, украсить необходимый конструктор InpectionConstructorattribute .

27
ответ дан 26 November 2019 в 23:43
поделиться

Я действительно должен указать, как вы используете инъекцию зависимости в этом случае просто неправильно. Контейнер должен быть в состоянии ввести несколькоvalueObject на конструкции.

То, что вы, скорее всего, должны сделать, это зарегистрировать объект по умолчанию quevalueObject, что свойство свойства .name возвращает string.uppy вместо этого.

-2
ответ дан 26 November 2019 в 23:43
поделиться

Инъекция нескольких конструктор с использованием атрибута

, когда целевой класс содержит более чем один конструктор с тем же номером параметров, вы должны применить Атрибут инзавидной конструкции к Конструктор, что контейнер Unity будет использовать, чтобы указать, какой конструктор Контейнер должен использовать. Как с Автоматическая инъекция конструктора, вы Можете указать параметры конструктора как бетонный тип, или вы можете указать интерфейс или базовый класс для которого Контейнер Unity содержит зарегистрированное отображение.

4
ответ дан 26 November 2019 в 23:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: