使用Castle Windsor Typed Factory Facility生成建筑工人

时间:2015-05-02 20:25:02

标签: c# castle-windsor castle-dynamicproxy typed-factory-facility

我想扩展Windsor的Typed Factory Facility以建立一个保留某些州的工厂,例如:工厂本身的属性,用于解决工厂创建的事物的依赖关系。有点像Typed Builder Facility。

所以,我会定义我的工厂界面......

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

    IFish CreateFish(string name);
    void ReleaseFish(IFish fish);
}

这将创建这样的组件......

class Fish : IFish
{
    public Fish(string name, string fishType, double swimSpeed)
    {
    }
}

可以像这样使用......

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);

您可以访问工厂上的方法,类型以及传递给方法的参数,但不能访问工厂对象本身。在你熟悉循环依赖之前,我的工厂是暂时的。

我目前的解决方法是在我的拦截器中访问Typed Factory的拦截器(通过代理),然后抓住组件选择器(因此需要使其成为瞬态)。然后我将属性值戳到组件选择器所持有的字典中(实际上,使用组件选择器作为工厂属性的存储支持)。然而,这感觉就像很多hacky交叉耦合,我宁愿避免。

所以,现在我正在寻找有关如何改善这一点的建议。

提前致谢!

0 个答案:

没有答案