C# 使用Castle Windsor类型的工厂设施生成生成器

C# 使用Castle Windsor类型的工厂设施生成生成器,c#,castle-windsor,castle-dynamicproxy,typed-factory-facility,C#,Castle Windsor,Castle Dynamicproxy,Typed Factory Facility,我想扩展Windsor的类型化工厂功能,以创建一个保留某些状态的工厂,例如工厂本身的属性,这些属性将用于解决工厂创建的内容的依赖关系。有点像一个类型化的构建工具 所以,我会像这样定义我的工厂接口 public interface IFishBuilder { string FishType { get; set; } double SwimSpeed { get; set; } IFish CreateFish(string name); void Releas

我想扩展Windsor的类型化工厂功能,以创建一个保留某些状态的工厂,例如工厂本身的属性,这些属性将用于解决工厂创建的内容的依赖关系。有点像一个类型化的构建工具

所以,我会像这样定义我的工厂接口

public interface IFishBuilder
{
    string FishType { get; set; }
    double SwimSpeed { get; set; }

    IFish CreateFish(string name);
    void ReleaseFish(IFish fish);
}
IFishBuilder b;
b.SwimSpeed = 50;
b.FishType = "Shark";
b.CreateFish("Frank");
b.CreateFish("Bob");
b.SwimSpeed = 95;
b.CreateFish("Usain");
这将创建这样的组件

class Fish : IFish
{
    public Fish(string name, string fishType, double swimSpeed)
    {
    }
}
并且像这样被使用

public interface IFishBuilder
{
    string FishType { get; set; }
    double SwimSpeed { get; set; }

    IFish CreateFish(string name);
    void ReleaseFish(IFish fish);
}
IFishBuilder b;
b.SwimSpeed = 50;
b.FishType = "Shark";
b.CreateFish("Frank");
b.CreateFish("Bob");
b.SwimSpeed = 95;
b.CreateFish("Usain");
这不是一个很好的例子,但是让我们不要太担心用例,除了理解初始化的工厂将被传递给其他人来进行创建,而不理解它是如何初始化的

我已经朝着正确的方向迈出了一些步骤——事实上,它已经可以正常工作了。。。然而,我很确定应该有一个更简单的方法来实现这一点。到目前为止,我所做的是将第二个拦截器附加到工厂代理,它截取接口上的setter和getter属性。我最初的计划是,我为工厂定制的
ITypedFactoryComponentSelector
将从附加到代理对象的拦截器中读取属性

当然,这一切的缺点在于,
ITypedFactoryComponentSelector
接口没有提供任何方式来访问实现调用工厂方法的工厂的代理对象。这意味着我没有返回的路径来调用属性getter来读取工厂属性,以便
GetArguments
访问。让我再解释一遍。组件选择器的功能定义为

Func<IKernelInternal, IReleasePolicy, object> SelectComponent(MethodInfo method, Type type, object[] arguments);
Func SelectComponent(MethodInfo方法、类型、对象[]参数);
您可以访问工厂类上的方法、传递给该方法的类型和参数,但不能访问工厂对象本身。在你熟练使用循环依赖之前,我的工厂是暂时的

目前我的解决方法是在我的拦截器中访问类型化工厂的拦截器(通过代理),然后抓住组件选择器(因此需要使其成为瞬态)。然后,我将属性值插入到组件选择器持有的字典中(实际上,使用组件选择器作为支持工厂属性的存储)。然而,这感觉像是一个非常粗糙的交叉耦合,我宁愿避免

因此,现在我正在寻找如何改进这一点的建议


提前谢谢

您的建筑商和工厂是两个独立的关注点。这似乎很难,因为您违反了SRP。工厂方法必须提供实例化组件所需的所有参数。尽管您的构建器对象允许提供部分或全部依赖项,并且可能为任何未指定的依赖项提供默认值,但这不是工厂。因此,我将使用一个单独的构建器包装工厂,并委托Create()和Release()调用-不需要任何复杂的代理操作,只需要简单的组合。但总的来说,这一切仍然很难闻……我并不真的同意你的SRP观点,建设者的责任是创建组件,就像工厂的责任一样。唯一的区别是构建器有一些状态可以帮助它创建组件。显然,手工实现这样的东西很简单,但我想做的是让Castle Windsor为我实现“建设者”,就像它对工厂设施所做的那样。工厂的责任,正如Windsor提供的,不涉及控股状态,正如你所发现的,温莎没有为您提供一个直接的机制来扩展由工厂设施生产的工厂以承担此责任。如果您想创建自己的“类型化生成器工具”,那么您可以这样做。然而,我不知道为什么你会这样做,当它是琐碎的实现您想要的功能,甚至不需要依赖温莎。