温莎城堡物品工厂注入的属性

本文关键字:注入 属性 工厂 城堡 | 更新日期: 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添加到容器中

再次强调类型化工厂是解决方案。