我想扩展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交叉耦合,我宁愿避免。
所以,现在我正在寻找有关如何改善这一点的建议。
提前致谢!