在 IDependencyResolver 方面,MVC3 和 MVC4 之间没有区别,除了 WebAPI 有一个单独的解析器。
在我看来,迈克哈德洛在这个问题上有点过于刻薄了,许多其他人在没有真正考虑原因的情况下就加入了这个潮流。
是的,Castle Windsor 确实有一个特定的对象生活方式(即生命周期管理对象),称为 Pooled,通常需要您对其调用 Release。在使用这种生活方式时,您可能不应该使用 IDependencyResolver,因为它不提供对此 Release 方法的访问(尽管也有解决方法)。
但是,我觉得在 Web 应用程序中使用这种生活方式通常很糟糕,您应该改用 PerWebRequest 生活方式,它会在 Web 请求结束时自动释放对象。如果这是您正在使用的,那么将 IDependencyResolver 与 Castle Windsor 一起使用是没有问题的。
为什么我认为哈德洛太刻薄了?好吧,因为他的整个论点都基于此:
“没错,没有‘Release’方法。你可以从你的 IoC 容器中提供服务,但没有办法清理它。如果我要在 Suteki Shop 中使用它,我会遇到史诗般的内存泄漏。 "
然后,他继续引用 Krzysztof Koźmic 关于生活方式管理的文章,但忽略了引用他的后续文章,我将在此处介绍:
http://kozmic.net/2010/08/27/must-i-release-everything-when-using-windsor/
注意他在这里说的话:
“正如我在上一篇文章中提到的,Windsor 会跟踪你的组件,这是用户普遍持有的一个误解,即为了正确释放所有组件,他们必须在容器上调用 Release 方法。”
他还谈到了其他各个方面,但总的来说,我认为大多数人不会使用需要在 Web 应用程序中处理的池化或瞬态对象。如果你这样做了,那么你应该知道不要使用 IDependencyResolver。否则,您应该没有问题。
我知道我可能会从争论不休的人那里得到很多悲伤,但我根本不认为这是像哈德洛这样的人认为的世界末日问题,因为有很多选择和解决方法,即使当您确实需要致电 Release。
除此之外,使用需要调用 Release 的生活方式对开发人员来说意味着额外的工作。您现在必须管理对象的生命周期并记住处置对象,否则会导致内存泄漏。在我看来,这基本上抵消了垃圾收集的好处。我只对不需要处理的东西使用瞬态对象,而且我从不使用池对象。
顺便说一句,我可能错了,但我认为其他任何容器都没有这个问题。这使我得出的结论是,当所有其他容器似乎都没有问题时,是 Windsor 坏了,而不是 MVC。温莎喜欢固执地坚持它的现实版本,所以 YMMV。