16

J'ai une classe IAddress avec quelques propriétés. J'ai alors un type concret qui implémente cette interface. Ce type concret a un couple de constructeurs différents que je pourrais utiliser. Comment puis-je transmettre des valeurs de paramètres à l'un de ces constructeurs lors de l'exécution? Je ne peux pas utiliser le fichier de configuration car je réutiliserai ce type de béton plusieurs fois et chaque fois que les valeurs des paramètres seront différentes.Paramètres du constructeur de passage de Castle Windsor

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

Est-ce votre code réel ou juste un certain échantillon? Il semble que vous utilisiez le conteneur en remplacement de new(). –

+0

voulez-vous spécifier les paramètres à l'heure d'enregistrement ou de résolution? –

+0

Je voudrais spécifier les paramètres au moment de la résolution. Si j'ai besoin de deux classes d'adresses ayant chacune une adresse différente, j'aimerais transmettre les valeurs à chaque classe du constructeur. –

Répondre

23

Vous pouvez utiliser Resolve(object argumentsAsAnonymousType) ou Resolve(IDictionary arguments). Windsor sélectionnera le meilleur constructeur correspondant.

Par exemple, ceci sélectionnera votre deuxième constructeur:

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

Vous pouvez également envisager d'encapsuler cette invocation dans une fabrique, ou si vous obtenez des adresses d'ailleurs - en utilisant ISubDependencyResolver pour les fournir au conteneur, au lieu de les passer du site d'appel (si c'est une option) –

+0

Cela m'a aidé, merci ! –

+0

Hmm, intéressant. Et si vous utilisez MS CommonServiceLocator plutôt que d'appeler directement Castle Windsor? Une sorte d'installation? –