Я использую Единицу контейнер МОК для разрешения моих объектов. Однако я столкнулся с проблемой. Когда у меня есть больше чем один конструктор - как Единица знает который использовать? Это, кажется, использует тот с параметрами, когда я имею один с и один без. Я могу явно сказать это который конструктор использовать?
Конкретно у меня был случай, подобный следующему классу Человека с двумя конструкторами. В этом случае я хочу, чтобы контейнер МОК использовал конструктора по умолчанию - без параметров - но он выбирает тот с параметрами.
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>();
Зарегистрируйте это, как это так:
container.RegisterType<Person>(new InjectionConstructor());
Вы можете добавить LifetImeManager, используя перегрузку метода RegisterType.
Это сказано, что при моделировании DI, ваша жизнь будет намного проще, если у вас есть однозначные контракции (то есть нет перегруженных конструкторов).
По умолчанию Unity выбирает конструктор с максимальным количеством аргументов. Чтобы переопределить это, украсить необходимый конструктор InpectionConstructorattribute .
Я действительно должен указать, как вы используете инъекцию зависимости в этом случае просто неправильно. Контейнер должен быть в состоянии ввести несколькоvalueObject на конструкции.
То, что вы, скорее всего, должны сделать, это зарегистрировать объект по умолчанию quevalueObject, что свойство свойства .name возвращает string.uppy
вместо этого.
Инъекция нескольких конструктор с использованием атрибута
, когда целевой класс содержит более чем один конструктор с тем же номером параметров, вы должны применить Атрибут инзавидной конструкции к Конструктор, что контейнер Unity будет использовать, чтобы указать, какой конструктор Контейнер должен использовать. Как с Автоматическая инъекция конструктора, вы Можете указать параметры конструктора как бетонный тип, или вы можете указать интерфейс или базовый класс для которого Контейнер Unity содержит зарегистрированное отображение.