【问题标题】:Castle Windsor Property Injection of IWindsorContainerIWindsorContainer 的 Castle Windsor 属性注入
【发布时间】:2012-06-14 15:50:18
【问题描述】:

我在将 IWindsorContainer 作为属性注入时遇到问题。

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

对于一个条件(“列表”视图),我想显示在 Windsor 中注册的所有 IMyTypes 的列表。 在我的 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 版本。


编辑第二个

我通过在整个依赖链中使用 Windsor 来让它工作,当然,这是你应该做的,我知道了。

【问题讨论】:

  • 同意@Code Jammr。绕过容器不是好的做法。
  • 因为无法引用容器时需要调用 ResolveAll?再次,请告诉我一个更好的方法。

标签: asp.net-mvc-3 castle-windsor


【解决方案1】:

您不应该依赖容器...这是一种反模式,它闻起来像服务定位器。 那么typed factory 呢?您的类型化工厂可能会返回一个基于通用接口的给定组件列表。

【讨论】:

  • 没有看过温莎附带的任何设施。查看示例,我需要引用 IKernel 是否会遇到与我当前需要引用 IWindsorContainer 相同的问题?
  • ...在这种情况下,我真的想遍历在 Windsor 中注册的所有不同的 IRuleDataDefinition 类型。看起来类型化工厂不一定是我想要的。
  • 抱歉,明确引用容器/内核(实际上,类型化工厂为您执行此操作,但从编码的角度来看是隐藏的)严重违反了 IoC 容器原则。我想知道你是否试图在设计方面做一些错误的事情。模式违规听起来通常是设计错误的标志。
  • 很有可能。我对 IoC 还是很陌生。不过,它似乎不会出错(毕竟 ResolveAll 是一个内置方法。)而且,在使用它更多之后,我意识到我真的必须拥有整个 Dependency连锁店通过温莎注册并解决,让其中一项较低的项目与温莎合作。一旦我这样做了,我正在尝试的工作。因此,鉴于此,我敢打赌 TypedFactory 也能正常工作(并且可能是一种更好的方法。)
  • 好的...所以 TypedFactory 工作得很好。谢谢!显然,真正的问题是需要整个依赖链成为 Windsor 的一部分。
猜你喜欢
  • 2023-03-10
  • 2011-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多