Can Castle Windsor可用于在ASP.NET MVC 4中实现IDependencyResolver吗?

sea*_*717 6 dependency-injection castle-windsor asp.net-mvc-4

我读过这篇文章并看到很多人评论说不要使用Castle Windsor在ASP.NET MVC3中实现IDependencyResolver并坚持使用自定义的IControllerFactory.基本上我现在的问题是:

  1. 不要使用Castle Windsor来实现IDependencyResolver.在ASP.NET MVC 4中这仍然是正确的吗?

  2. 如果是1的话.任何其他DI容器(Unity,StructureMap)都有与Castle Windsor相同的问题吗?我可以使用任何替代品吗?

非常感谢

编辑

听我说Castle Windsor不应该被用来实现IDependencyResolver.我已决定使用其他一些DI容器,例如StructureMap

Eri*_*sch 4

MVC3 和 MVC4 在 IDependencyResolver 方面没有任何区别,除了有一个单独的 WebAPI 解析器之外。

\n\n

在我看来,迈克·哈德洛(Mike Hadlow)在这个问题上有点过于刻薄,许多其他人也没有真正考虑过原因就跟上了潮流。

\n\n

是的,Castle Windsor 确实有一个称为 Pooled 的特定对象生活方式(即生命周期管理对象),通常需要您对其调用 Release。当使用这种生活方式时,您可能不应该使用 IDependencyResolver,因为它不提供对此 Release 方法的访问(尽管也有解决方法)。

\n\n

但是,我觉得在 Web 应用程序中使用这种生活方式通常很糟糕,您应该使用 PerWebRequest 生活方式,它会在 Web 请求结束时自动释放对象。如果这就是您正在使用的,那么将 IDependencyResolver 与 Castle Windsor 一起使用就没有问题。

\n\n

为什么我认为哈德洛太刻薄了?好吧,因为他的整个论点都基于此:

\n\n

“那个\xe2\x80\x99是对的,没有\xe2\x80\x98Release\xe2\x80\x99方法。你可以从IoC容器提供服务,但是\xe2\x80\x99s没有办法清理它。如果我要在 Suteki Shop 中使用它,我会遇到严重的内存泄漏。”

\n\n

然后他继续引用 Krzysztof Ko\xc5\xbamic\ 关于生活方式管理的文章,但忽略了引用我将在这里做的后续文章:

\n\n

http://kozmic.net/2010/08/27/must-i-release-everything-when-using-windsor/

\n\n

请注意他在这里所说的话:

\n\n

“因为我在之前的\xc2\xadvi\xc2\xadous帖子中提到\xc2\xadtioned,Wind\xc2\xadsor将跟踪您的com\xc2\xadpo\xc2\xadnent,它\ xe2\x80\x99是一个com\ xc2\xadmon 是用户持有的错误\xc2\xadcon\xc2\xadcep\xc2\xadtion,为了支持\xc2\xaderly 释放所有 com\xc2\xadpo\xc2\xadnents,他们必须在容器上调用 Release 方法。”

\n\n

他还继续讨论其他各个方面,但总的来说,我认为大多数人不会使用需要在 Web 应用程序中处理的池化或瞬态对象。如果您这样做,那么您应该知道不要使用 IDependencyResolver。否则,你应该没有问题。

\n\n

我知道我可能会因为人们的不同观点而感到悲伤,但我根本不认为这是像哈德洛这样的人认为的世界末日问题,因为即使在你确实需要调用Release。

\n\n

除此之外,使用需要调用 Release 的生活方式对您(开发人员)来说意味着额外的工作。您现在必须管理对象的生命周期并记住处置对象,否则会导致内存泄漏。在我看来,这本质上抵消了垃圾收集的好处。我只将瞬态对象与不需要处理的对象一起使用,并且从不使用池对象。

\n\n

顺便说一句,我可能是错的,但我不认为任何其他容器有这个问题。这让我得出这样的结论:是 Windsor 出了问题,而不是 MVC,而其他所有容器似乎都没有这个问题。温莎喜欢固执地坚持它的现实版本,所以 YMMV。

\n

  • @Meixger - 你能解释一下为什么你需要一个生命周期需要比网络请求的跨度更快的对象吗? (3认同)