2

我们使用温莎的typed factory facility,并认为它很可爱。我们使用interface-based factories。但是,我们希望禁用delegate-based factories的某些子集,特别是隐式注册的工厂。这些都是违反直觉的,不是因为它们是代表,而是因为它们是神奇创造的,并且可以推迟失败。可以禁用Windsor的TypedFactoryFacility的隐式委托工厂注册吗?

如果我们有一个类,这需要委托作为依赖

class X { public X(Func<int,IPrincipal> d); } 

然后与已注册的类型化的工厂设施的容器注册。

container.Kernel.Register(Component.For<X>().ImplementedBy<X>()) 

我可以解决它没有任何麻烦,这是违反直觉在第一,因为没有人告诉我们有什么要说Func<int,IPrincipal>容器。

var x = container.Resolve<X>(); 

而我不会遇到失败,直到我试图实际使用该隐式创建的工厂。

x.D(0); // no registration for IPrincipal 

虽然这是有道理的,从某个角度来看,事实证明这个厂是隐含产生麻烦。这是一个非常容器感知的行为。编写任意类的人会发现通过代理参数化他们的行为是有用的,一旦我们把它们放入IoC容器中,我们就会遇到这种令人惊讶的行为。

这就是说,有一个聪明的隐含工厂似乎值得保留。现在,Windsor将为Func<T>形式的依赖关系创建一个简单的工厂,从而允许依赖关系的使用者延迟实际创建。在4.0框架中,将此改为识别Lazy<T>可能是有意义的,因为它明确表明您只是推迟构建T,而不是试图访问实施有趣策略的工厂。

是否有一个聪明的开关可用于配置TypedFactoryFacility还是我们需要实现一些新的对象来得到我们想要的行为?

回答

1

如果你真的想你可以从容器中,这是创建基于委托的工厂删除DelegateFactory组件。

相关问题