16

Mam klasę IAddress z kilkoma właściwościami. Mam wtedy konkretny typ, który implementuje ten interfejs. Ten konkretny typ ma kilka różnych konstruktorów, z których mógłbym skorzystać. Jak mogę przekazywać wartości parametrów do jednego z tych konstruktorów w czasie wykonywania? Nie mogę użyć pliku konfiguracyjnego, ponieważ będę wielokrotnie wykorzystywał ten konkretny typ i za każdym razem wartości parametrów będą różne.Castle Windsor przekazuje parametry konstruktora

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

Jest to rzeczywisty kod lub tylko niektóre próbki? Wygląda na to, że używasz kontenera jako zamiennika new(). –

+0

Czy chcesz określić parametry w czasie rejestracji lub rozdzielczości? –

+0

Chciałbym określić parametry w czasie rozdzielczości. Jeśli potrzebuję 2 klas adresów, każda z innym adresem, chciałbym przekazać wartości do każdej klasy w konstruktorze. –

Odpowiedz

23

Można użyć Resolve(object argumentsAsAnonymousType) lub Resolve(IDictionary arguments). Windsor wybierze najlepszy zgodny konstruktor.

Przykładowo będzie to wybierz drugą konstruktora:

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

Możesz również rozważyć zawijanie tego wywołania w fabryce lub, jeśli otrzymujesz adresy z innych miejsc - używając ISubDependencyResolver, aby dostarczyć je do kontenera, zamiast przekazywać je z witryny połączenia (jeśli jest to opcja) –

+0

To mi pomogło, dzięki ! –

+0

Hmm, interesujące. Co jeśli używasz MS CommonServiceLocator zamiast dzwonić bezpośrednio do Castle Windsor? Jakiś obiekt? –