我在我的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");
工厂是否有按名称解析组件并注入属性和/或构造函数值的示例?
答案 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是解决方案。