16

У меня есть класс IAddress с несколькими свойствами. Тогда у меня есть конкретный тип, который реализует этот интерфейс. У этого конкретного типа есть несколько различных конструкторов, которые я мог бы использовать. Как передать значения параметров одному из этих конструкторов во время выполнения? Я не могу использовать файл конфигурации, поскольку я буду повторно использовать этот конкретный тип несколько раз и каждый раз, когда значения параметров будут разными.Замок Виндзор, передающий параметры конструктора

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

Хм, интересно. Что делать, если вы используете MS CommonServiceLocator вместо прямого вызова в Castle Windsor? Какой-то объект? –

Смежные вопросы