1

我在我的 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");

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

4

2 回答 2

1

类型化工厂再次成为解决方案。

于 2013-06-06T21:57:13.463 回答
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 添加到容器中。

于 2013-06-07T10:25:37.287 回答