如何使用c'tor依赖项创建服务的多个组件

时间:2009-11-05 14:32:10

标签: constructor dependencies castle-windsor

我想创建几个类似的服务,这些服务可以通过名称(=键)进行去处理和访问。

对于服务实现,我想使用具有c'tor依赖关系的类,如下所示:

public interface IXYService
{
 string Tag { get; set; }
}

public class _1stXYService : IXYService
{
 public _1stXYService(string Tag)
    {
        this.Tag = Tag;
    }

    public string Tag { get; set; }
}

我尝试使用'AddComponentWithProperties'创建一个可通过给定密钥访问的具体实例:

...
    IDictionary l_xyServiceInitParameters = new Hashtable { { "Tag", "1" } };
    l_container.AddComponentWithProperties
        (
            "1st XY service", 
            typeof(IXYService), 
            typeof(_1stXYService), 
            l_xyServiceInitParameters
        );

    l_xyServiceInitParameters["Tag"] = "2";
    l_container.AddComponentWithProperties
        (
            "2nd XY service", 
            typeof(IXYService), 
            typeof(_1stXYService), 
            l_xyServiceInitParameters
        );
...

var service = l_container[serviceName] as IXYService;

但是,依赖关系未得到解决,因此服务不可用。

不需要使用IWindsorContainer.Resolve(...)来填充参数。

通过XML构建工作,但并非在所有情况下都足够。

我怎样才能实现目标?

1 个答案:

答案 0 :(得分:2)

如果您想在注册时定义Tag属性:

[Test]
public void Named() {
    var container = new WindsorContainer();
    container.Register(Component.For<IXYService>()
        .ImplementedBy<_1stXYService>()
        .Parameters(Parameter.ForKey("Tag").Eq("1"))
        .Named("1st XY Service"));
    container.Register(Component.For<IXYService>()
        .ImplementedBy<_1stXYService>()
        .Parameters(Parameter.ForKey("Tag").Eq("2"))
        .Named("2nd XY Service"));

    Assert.AreEqual("2", container.Resolve<IXYService>("2nd XY Service").Tag);
}