2011-03-09 25 views
16

tengo esta clase:unidad no utilizando el constructor predeterminado de la clase

public class Repo 
{ 
    public Repo() : this(ConfigurationManager.AppSettings["identity"],  ConfigurationManager.AppSettings["password"]) 

    { 

    } 

    public Repo(string identity,string password) 
    { 
     //Initialize properties. 
    } 

} 

I añadió una línea para web.config para que este tipo será construido automáticamente por contenedor Unity.

pero durante la ejecución de mi solicitud, recibo este mensaje de error:

"System.InvalidOperationException : the parameter identity could not be resolved when attempting to call constructor Repo(String identity, String password) -->Microsoft.Practices.ObjectBuilder2.BuildFailedException : The current Build operation ...." 

1) ¿Por qué no es la unidad utilizando el constructor por defecto?

2) Supongamos que quiero que Unity use el segundo constructor (el que está parametrizado), ¿cómo puedo pasar esa información a Unity a través del archivo de configuración?

Respuesta

49

Unity selecciona de manera predeterminada el constructor con la mayoría de los parámetros. Debe decirle a Unity que use una diferente explícitamente.

Una forma de hacerlo es con la [InjectionConstructor] atribuyen como esto:

using Microsoft.Practices.Unity; 

public class Repo 
{ 
    [InjectionConstructor] 
    public Repo() : this(ConfigurationManager.AppSettings["identity"], ConfigurationManager.AppSettings["password"]) 
    { 

    } 

    public Repo(string identity,string password) 
    { 
     //Initialize properties. 
    } 
} 

Una segunda manera de hacer esto, si su oposición a estorbar encima de clases/métodos con los atributos, es especificar qué constructor utilizar al configurar el contenedor utilizando un InjectionConstructor:

IUnityContainer container = new UnityContainer(); 
container.RegisterType<Repo>(new InjectionConstructor()); 

Desde el documentation:

Cómo constructores Resuelve la unidad de destino y parámetros

Cuando una clase de destino contiene más de un constructor, Unidad utilizará el que tiene el atributo InjectionConstructor aplicado. Si hay más de un constructor y ninguno tiene el atributo InjectionConstructor, Unity usará el constructor con como la mayoría de los parámetros. Si hay más de un constructor de este tipo (más que uno de los "más largos" con la misma cantidad de parámetros), Unity generará una excepción.

+0

@IanWarburton Si usted explica lo que ha intentado, y lo que viste, voy a tratar de ayudar a resolver el problema. –

+0

Hmm ¡es bueno saberlo! De alguna manera, esperaba que llamara al constructor con los parámetros LEAST ... interesante – Jowen

+0

¿Por qué Unity no escoge el * default * constructor como su * default *? No tiene demasiado sentido también yo ... – talles

18

Solo trata de registrar el tipo de esta manera:

<register type="IRepo" mapTo="Repo"> 
    <constructor /> 
</register> 

Debido a ningún elemento param se especifica en constructor elemento que debe llamar constructor por defecto.

También puede hacer esto en el registro de código:

container.RegisterType<IRepo, Repo>(new InjectionConstructor()); 
+0

¡La mejor respuesta! Esto resuelve el problema, el comentario anterior solo explica el comportamiento predeterminado. – charino

Cuestiones relacionadas