Especifique el constructor para el contenedor de Unity IoC para usar

Estoy usando el contenedor Unity IoC para resolver mis objetos. Sin embargo, me he encontrado 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 otro sin. ¿Puedo decirle explícitamente qué constructor usar?

Específicamente tuve un caso similar a la siguiente clase de persona con dos constructores. En este caso, quiero que el contenedor IoC use el constructor predeterminado, sin parámetros, pero elige el que tiene 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; } } 

Esto obviamente falla, ya que no puede crear SomeValueObject, sin saber qué inyectar en su parámetro de cadena. El error que da es:

Falló la resolución de la dependencia, escriba = “MyApp.Person”, name = “”. El mensaje de excepción es: Error en la operación de comstackción actual (clave de comstackción [MyApp.Person, null]): el parámetro obj no se pudo resolver al intentar llamar al constructor MyApp.Person (MyApp.SomeValueObject obj). (Tipo de estrategia BuildPlanStrategy, índice 3)

El registro del contenedor:

 Container.RegisterType(new Microsoft.Practices.Unity.ContainerControlledLifetimeManager()); 

Y la resolución:

 var person = Container.Resolve(); 

Regístrelo así en su lugar:

 container.RegisterType(new InjectionConstructor()); 

También puede agregar LifetimeManager utilizando una sobrecarga del método RegisterType.

Dicho esto, al modelar para DI, su vida será mucho más fácil si tiene contructores inequívocos (es decir, no hay constructores sobrecargados).

Por defecto, Unity elige un constructor con el número máximo de argumentos. Para anular esto, decore el constructor requerido con InjectionConstructorAttribute .

Inyección de múltiples constructores usando un atributo

Cuando una clase de destino contiene más de un constructor con el mismo número de parámetros, debe aplicar el atributo InjectionConstructor al constructor que utilizará el contenedor de Unity para indicar qué constructor debe usar el contenedor. Al igual que con la inyección automática del constructor, puede especificar los parámetros del constructor como un tipo concreto, o puede especificar una interfaz o clase base para la cual el contenedor de Unity contiene una asignación registrada.

Realmente tengo que señalar que la forma en que está utilizando la dependency injection en este caso es simplemente incorrecta. El contenedor debe poder inyectar SomeValueObject en la construcción.

Lo que probablemente debería hacer es registrar un objeto predeterminado de SomeValueObject que la propiedad string.Empty devuelve string.Empty en string.Empty lugar.