16

私はいくつかのプロパティを持つIAddressクラスを持っています。私はこのインターフェイスを実装する具体的な型を持っています。この具体的な型には、私が使用できるいくつかの異なるコンストラクタがあります。実行時にこれらのコンストラクタのいずれかにパラメータ値を渡すにはどうすればよいですか?この具体的なタイプを複数回、パラメータ値が異なるたびに再利用するため、設定ファイルを使用することはできません。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

これはあなたの実際のコードまたは単にいくつかのサンプルですか? new()の代わりにコンテナを使用しているようです。 –

+0

登録時または解決時にパラメータを指定しますか? –

+0

解決時間にパラメータを指定したいと思います。別のアドレスを持つ2つのアドレスクラスが必要な場合は、コンストラクタの各クラスに値を渡したいと思います。 –

答えて

23

あなたはResolve(object argumentsAsAnonymousType)Resolve(IDictionary arguments)を使用することができます。ウィンザーは、最も合致するコンストラクタを選択します。例えば

これは2番目のコンストラクタを選択します:

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

また、この呼び出しをファクトリでラップすることも、別の場所からアドレスを取得する場合もあります。コールサイトから渡すのではなく、ISubDependencyResolverを使用してコンテナに提供します(これがオプションの場合) –

+0

これは、 ! –

+0

うーん、興味深い。だが、Castle Windsorに直接呼び出すのではなく、MS CommonServiceLocatorを使用している場合はどうしますか?ある種の施設? –

関連する問題