views:

1478

answers:

1

I have an IAddress class with a few properties. I then have a concrete type that implements this interface. This concrete type has a couple of different constructors I could use. How can I pass parameter values to one of these constructors at run-time? I cannot use the config file as I will be reusing this concrete type multiple times and each time the parameter values will be different.

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)
    { }
}

}

+4  A: 

You can use Resolve(object argumentsAsAnonymousType) or Resolve(IDictionary arguments). Windsor will select the best matching constructor.

For example this will select your second constructor:

container.Resolve<IAddress>(new {address1 = "myaddress1", address2 = "myaddress2", zipcode = "myzipcode"})
Mauricio Scheffer
You might also consider wrapping this invocation in a factory, or if you get addresses from elsewhere - using ISubDependencyResolver to provide them to the container, instead of passing them from the call site (if this is an option)
Krzysztof Koźmic
This helped me, thanks!
Jason More
Hmm, interesting. What if you're using the MS CommonServiceLocator rather than directly calling into Castle Windsor, though? Some sort of facility?
Neil Barnwell