Windsor Castle对象工厂“GetByName”注入属性

时间:2013-06-06 19:52:42

标签: c# castle-windsor

我在我的c#项目中使用Castle Windsor进行DI,我就是这个场景:

public class Class1:IMyClass
{
     public string Name{get{return "Class1";}}
     public int Version {get; set;}
     private string _description;

     public Class1(string description)
     {
        this._description=description;
     }
}
public class Class2:IMyClass
{
     public string Name{get{return "Class2";}}
     public int Version {get; set;}
     private string _description;

     public Class2(string description)
     {
        this._description=description;
     }
}

我可以通过常见的IMyClass接口注册这些类,但现在我需要一个工厂来创建一个确定的实例;像这样的东西:

IMyClass _myClass= someClassFactory.GetByName("Class2", version=1, description="test");

工厂是否有按名称解析组件并注入属性和/或构造函数值的示例?

2 个答案:

答案 0 :(得分:1)

绝对正确的克里斯蒂亚诺。这里有更多信息。 无论您如何编写工厂,都无法基于Name属性创建组件。原因是该属性仅在创建对象后可用,并且工厂在此之前需要它。

创建工厂:

interface ISomeClassFactory 
{
    IMyClass GetById(string name, int version, string description);
}

和一个选择器(复制自:http://docs.castleproject.org/Windsor.Typed-Factory-Facility-interface-based-factories.ashx

public class CustomTypedFactoryComponentSelector : DefaultTypedFactoryComponentSelector
{
    protected override string GetComponentName(MethodInfo method, object[] arguments)
    {
        if(method.Name == "GetById" && arguments.Length == 1 && arguments[0] is string)
        {
            return (string)arguments[0];
        }
        return base.GetComponentName(method, arguments);
    }
}

并注册如下:

Component.For<IMyClass>().ImplementedBy<Class1>().Named("Class1"),
Component.For<IMyClass>().ImplementedBy<Class2>().Named("Class2")
Component.For<IISomeClassFactory>().AsFactory(c=> new CustomTypedFactoryComponentSelector())

还要确保将TypedFactoryFacility添加到容器中。

答案 1 :(得分:0)

再次Typed factory是解决方案。