sea*_*717 6 dependency-injection castle-windsor asp.net-mvc-4
我读过这篇文章并看到很多人评论说不要使用Castle Windsor在ASP.NET MVC3中实现IDependencyResolver并坚持使用自定义的IControllerFactory.基本上我现在的问题是:
不要使用Castle Windsor来实现IDependencyResolver.在ASP.NET MVC 4中这仍然是正确的吗?
如果是1的话.任何其他DI容器(Unity,StructureMap)都有与Castle Windsor相同的问题吗?我可以使用任何替代品吗?
非常感谢
编辑
听我说Castle Windsor不应该被用来实现IDependencyResolver.我已决定使用其他一些DI容器,例如StructureMap
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\nhttp://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| 归档时间: |
|
| 查看次数: |
1385 次 |
| 最近记录: |