温莎城堡物品工厂注入的属性
本文关键字:注入 属性 工厂 城堡 | 更新日期: 2023-09-27 18:17:20
我使用城堡温莎在我的c#项目的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");
是否有一个工厂通过名称解析组件并注入属性和/或构造函数值的例子?
完全正确,c罗。这里有更多的信息。无论如何编写工厂,都不能基于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添加到容器中
再次强调类型化工厂是解决方案。