Estoy usando el contenedor Unity IoC para resolver mis objetos. Sin embargo, me encontré con un problema. Cuando tengo más de un constructor, ¿cómo sabe Unity cuál usar? Parece usar el que tiene parámetros cuando tengo uno con y sin él. ¿Puedo decir explícitamente qué constructor usar?Especifique el constructor para el contenedor Unity IoC para usar
Específicamente tuve una carcasa similar a la siguiente clase Person con dos constructores. En este caso, quiero que el contenedor IoC use el constructor predeterminado, sin parámetros, pero elige el que tiene los parámetros.
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;
}
}
Obviamente, esto falla, ya que no se puede crear el SomeValueObject - sin saber qué inyectar a su parámetro de cadena. El error que da es:
Resolución de la dependencia fallida, type = "MyApp.Person", name = "". El mensaje de excepción es: La operación de compilación actual (clave de compilación Build Key [MyApp.Person, null]) falló: El parámetro obj no se pudo resolver al intentar llamar al constructor MyApp.Person (MyApp.SomeValueObject obj). (Tipo de estrategia de BuildPlanStrategy, índice 3)
El registro contenedor:
Container.RegisterType<Person, Person>(new Microsoft.Practices.Unity.ContainerControlledLifetimeManager());
Y la resolución de:
var person = Container.Resolve<Person>();
¿No es el objetivo de IoC utilizar interfaces? – Martin
Claro, y lo hago principalmente. Pero esto no hizo la diferencia para la pregunta. – stiank81
@Martin Muchos programadores usan clases y evitan la falsa generalidad de crear una interfaz y luego solo tener una implementación de la misma. También evita las acumulaciones de cableado IoC desagradable que ves en la mayoría de las aplicaciones empresariales, pero aún te permite cambiar algunas implementaciones cuando sea necesario. http://programmers.stackexchange.com/questions/133471/writing-testable-code-vs-avoiding-speculative-generality –