Я использую контейнер Unity IoC для разрешения своих объектов. Однако я столкнулся с проблемой. Когда у меня есть несколько конструкторов - как Unity знает, какой из них использовать? Кажется, он использует один с параметрами, когда у меня есть один и один без. Можно ли явно указать, какой конструктор использовать?
В частности, у меня был случай, похожий на следующий класс Person с двумя конструкторами. В этом случае я хочу, чтобы контейнер IoC использовал конструктор по умолчанию - без параметров - но он выбирает параметр с параметрами.
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 - не зная, что нужно вводить в свой строковый параметр. Ошибка, которую он дает:
Сбой разрешения зависимостей, type = "MyApp.Person", name = "". Сообщение об исключении: текущая операция сборки (ключ сборки Build Key [MyApp.Person, null]) не удалось: параметр obj не удалось устранить при попытке вызвать конструктор MyApp.Person(MyApp.SomeValueObject obj). (Тип стратегии BuildPlanStrategy, индекс 3)
Регистрация контейнера:
Container.RegisterType<Person, Person>(new Microsoft.Practices.Unity.ContainerControlledLifetimeManager());
И разрешение:
var person = Container.Resolve<Person>();