2012-06-14 53 views
0

我在注入IWindsorContainer作为物业时遇到问题。Castle Windsor IWindsorContainer的物业注入

我正在使用MVC3。我创建了我自己的IView和ViewEngine。从视图中我根据Windsor中注册的类型动态构建视图。

对于一个条件(“列表”视图)我想显示所有在Windsor注册的IMyType列表。 在我的Global.asax我注册了温莎看法是这样的:

container.Register(Component.For<IWindsorContainer>().Instance(container)); 

然后在我的iView实现,我宣布一个属性是这样的:

public IWindsorContainer Container { get; set; } 

实际的iView是另一个组件。当我到达Render方法时,我想这样做:

IRuleDataDefinition[] ruleDatas = Container.ResolveAll<IRuleDataDefinition>(); 

但“容器”始终为空。是因为我创建IView的方式(我只是使用新的,它没有在Windsor注册?)它是否与IWindsorContainer本身有关?还是我一切都错了?

我也读过其他人说,“如果你使用Container.Resolve你可能做错了。”所以如果我做错了,请告诉我。


编辑

也许更好的方式来短语的问题是:什么是做container.ResolveAll()相当于当你不拥有该容器的参考的最佳方式?我需要遍历所有注册版本的IMyType。


编辑2ND

我把它用温莎整个依赖链,这当然是你应该做的工作,我学到了。

+2

你为什么要这样做? –

+0

同意@Code Jammr。绕过容器不是好习惯。 –

+0

原因当容器不能被引用时,我需要调用ResolveAll?再次,请告诉我一个更好的方法。 –

回答

3

您不应该对Container有依赖关系...这是一种反模式,它闻起来像一个服务定位器。 那么typed factory呢?您输入的工厂可能会根据通用界面返回给定组件的列表。

+0

没有看过温莎附带的任何设施。看样本,我不会有需要引用IKernel相同的问题,我目前需要引用IWindsorContainer? –

+0

...在这种情况下,我真的想循环遍历在Windsor注册的所有不同的IRuleDataDefinition类型。它似乎不是一个类型的工厂必然是我想要的。 –

+0

对不起,但有一个明确的容器/内核引用(实际上类型化的工厂为你做,但从编码的角度来看是隐藏的)对IoC容器原理是非常不利的违反。我想知道你是否试图明智地设计错误的设计。模式违规听起来常常是设计错误的标志。 – Crixo