16

Tengo una clase IAddress con algunas propiedades. Luego tengo un tipo concreto que implementa esta interfaz. Este tipo concreto tiene un par de diferentes constructores que podría usar. ¿Cómo puedo pasar los valores de los parámetros a uno de estos constructores en tiempo de ejecución? No puedo usar el archivo de configuración ya que reutilizaré este tipo concreto varias veces y cada vez los valores de los parámetros serán diferentes.Castle Windsor que pasa los parámetros del constructor

IWindsorContainer container = new WindsorContainer(new XmlInterpreter()); 
IAddress address = container.Resolve<IAddress>(); 


public interface IAddress 
{ 
    string Address1 { get; set; } 
    string Address2 { get; set; } 
    string City { get; set; } 
    string State { get; set; } 
    string ZipCode { get; set; } 
} 


class TestAddress : IAddress 
{ 

    private string _address1; 
    private string _address2; 
    private string _city; 
    private string _countyName; 
    private string _state; 
    private string _zipCode; 

    public string Address1 
    { 
     get { return _address1; } 
     set { _address1 = value; } 
    } 

    public string Address2 
    { 
     get { return _address2; } 
     set { _address2 = value; } 
    } 

    public string City 
    { 
     get { return _city; } 
     set { _city = value; } 
    } 

    public string State 
    { 
     get { return _state; } 
     set { _state = value; } 
    } 

    public string ZipCode 
    { 
     get { return _zipCode; } 
     set { _zipCode = value; } 
    } 

    public string CountyName 
    { 
     get { return _countyName; } 
     set { _countyName = value; } 
    } 


    public MelissaAddress(string address1, string address2, string city, string state, string zipcode) 
    { 
     Address1 = address1; 
     Address2 = address2; 
     City = city; 
     State = state; 
     ZipCode = zipcode; 
    } 

    public MelissaAddress(string address1, string address2, string zipcode) : this(address1, address2, null, null, zipcode) 
    { } 

    public MelissaAddress(string address1, string address2, string city, string state) : this(address1, address2, city, state, null) 
    { } 
} 
+1

Este es su código real o sólo una muestra? Parece que estás usando el contenedor como reemplazo de new(). –

+0

¿desea especificar parámetros en el tiempo de registro o tiempo de resolución? –

+0

Me gustaría especificar los parámetros en el momento de la resolución. Si necesito 2 clases de direcciones, cada una con una dirección diferente, me gustaría pasar los valores a cada clase en el constructor. –

Respuesta

23

Puede utilizar Resolve(object argumentsAsAnonymousType) o Resolve(IDictionary arguments). Windsor seleccionará el mejor constructor que combine.

Por ejemplo, esto va a elegir el segundo constructor:

container.Resolve<IAddress>(
    new {address1 = "myaddress1", address2 = "myaddress2", zipcode = "myzipcode"} 
) 
+4

También podría considerar envolver esta invocación en una fábrica, o si obtiene direcciones de otra parte, utilizando ISubDependencyResolver para proporcionarlas al contenedor, en lugar de pasarlas desde el sitio de llamadas (si esta es una opción) –

+0

Esto me ayudó, gracias ! –

+0

Hmm, interesante. Sin embargo, ¿qué sucede si estás utilizando MS CommonServiceLocator en lugar de llamar directamente a Castle Windsor? ¿Algún tipo de instalación? –

Cuestiones relacionadas