【问题标题】:Castle Windsor passing constructor parameters温莎城堡传递构造函数参数
【发布时间】:2009-04-24 02:00:55
【问题描述】:

我有一个带有一些属性的 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)
    { }
}

【问题讨论】:

  • 这是您的实际代码还是只是一些示例?看起来您正在使用容器作为 new() 的替代品。
  • 您要在注册时或解析时指定参数吗?
  • 我想在解析时指定参数。如果我需要 2 个地址类,每个类都有不同的地址,那么我想将值传递给构造函数中的每个类。

标签: dependency-injection inversion-of-control castle-windsor ioc-container


【解决方案1】:

您可以使用Resolve(object argumentsAsAnonymousType)Resolve(IDictionary arguments)。 Windsor 将选择最匹配的构造函数。

例如,这将选择您的第二个构造函数:

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

【讨论】:

  • 您也可以考虑将此调用包装在工厂中,或者如果您从其他地方获取地址 - 使用 ISubDependencyResolver 将它们提供给容器,而不是从调用站点传递它们(如果这是一个选项)
  • 嗯,很有趣。但是,如果您使用 MS CommonServiceLocator 而不是直接调用 Castle Windsor 怎么办?某种设施?
  • 是否有可能在同一个构造函数中只传递一些参数并有其他参数,由温莎城堡解决?
  • @SideFX:不,但您可能要问的是在注册时完成的,而不是在解决时完成的。发布一个包含所有相关详细信息的新问题。
  • SideFX,Mauricio:实际上,SideFX 的要求是完全可能的,因为我现在正在这样做。无论您不提供什么,城堡都会尝试为您解决。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多