16

몇 가지 속성이있는 IAddress 클래스가 있습니다. 그런 다음이 인터페이스를 구현하는 구체적인 유형이 있습니다. 이 구체적인 유형에는 사용할 수있는 몇 가지 생성자가 있습니다. 어떻게하면 런타임에 이러한 생성자 중 하나에 매개 변수 값을 전달할 수 있습니까? 이 콘크리트 유형을 여러 번 재사용하고 매개 변수 값이 다를 때마다 구성 파일을 사용할 수 없습니다.성 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)를 사용할 수 있습니다. Windsor는 가장 일치하는 생성자를 선택합니다.

예를 들어이 두 번째 생성자를 선택합니다

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

또한이 호출을 팩토리에서 랩핑하거나 ISubDependencyResolver를 사용하여 콜 사이트 (옵션 인 경우)에서 전달하는 대신 컨테이너에 제공 할 수 있습니다. –

+0

덕분에 도움이되었습니다. 감사합니다. ! –

+0

흠, 흥미 롭습니다. 그래도 Castle Windsor에 직접 전화하는 대신 MS CommonServiceLocator를 사용한다면 어떨까요? 어떤 종류의 시설? –

관련 문제