【问题标题】:MVC 3 Dependency Resolver or Ninject MVC plugin?MVC 3 依赖解析器还是 Ninject MVC 插件?
【发布时间】:2011-03-01 20:40:49
【问题描述】:

在 MVC 3 中,他们添加了我一直在使用的 Dependency Resolver。在回答某人对您发表评论的问题时,您应该使用 Ninject MVC 3 插件。

所以我的问题是为什么要使用它而不是内置的?如果这是要走的路,你如何设置它?

Question

以上是我回答的问题的链接。

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 ninject ninject-2


    【解决方案1】:

    ASP.NET MVC 3 提供了一个依赖注入服务,它将挂钩到您选择实现的任何依赖解析器。 Ninject MVC 3 插件的功能非常简单,因为它所要做的就是实现System.Web.Mvc.IDependencyResolver 中定义的类型解析方法,并调用适当的 Ninject 方法来返回请求的类型。

    您是否选择使用自己的 IDependencyResolver 并将其映射到 Ninject(或任何其他依赖注入框架),或者您选择使用免费提供的 Ninject MVC 3 插件,主要是一个微不足道的区别。

    这是一个功能齐全的示例,展示了与 Ninject 兼容的手动 IDependencyResolver 的外观。 Ninject MVC 3 插件基本上非常相似:

    public class NinjectDependencyResolver : IDependencyResolver
    {
        private readonly IKernel _kernel;
    
        public NinjectDependencyResolver(IKernel kernel) {
            _kernel = kernel;
        }
    
        public object GetService(Type serviceType) {
            return _kernel.TryGet(serviceType, new IParameter[0]);
        }
    
        public IEnumerable<object> GetServices(Type serviceType) {
            return _kernel.GetAll(serviceType, new IParameter[0]);
        }
    }
    

    这里的重点是ASP.NET MVC 没有提供完善的依赖注入框架;它仅提供通过 IoC 容器(即 Ninject)在整个 ASP.NET MVC 请求管道(控制器解析、视图解析等)的特定点检索所需类型实例所需的层。

    注意:如果我使用的任何术语不太准确,请告知我。

    【讨论】:

    • 这看起来和我现在的差不多(见另一篇文章)。我听说(或者我想我听说过)在没有 mvc 插件的情况下自己这样做不会在使用 nhibernate 时终止会话。
    • @chobo2 我对 nHibernate 或您所描述的问题没有任何经验,所以我无法具体说明。 :[
    • @chobo2,也许您指的是 Ninject 的OnePerRequestModule,一旦请求结束,它将清除任何绑定 InRequestScope。它还将在运行任何其他 EndRequest 处理程序之前执行。不幸的是,自己这样做并不能阻止这种情况的发生。
    【解决方案2】:

    Ninject.Web.MVC 扩展(或 Ninject.MVC3 NuGet 包)也在内部使用依赖解析器。所以基本上它使用相同的机制。但是使用扩展而不是实现自己的依赖解析器有几个原因:

    1. 既然已经有一个扩展完全一样,为什么还要实现自己的依赖解析器?使用与其他实现相同的实现可以让您在遇到问题时更轻松地为您提供支持。此外,使用相同的实现越多,它就越稳定。 (见第 4 点)。
    2. 该扩展不仅仅是一个依赖解析器。请参阅 http://www.planetgeek.ch/2010/11/13/official-ninject-mvc-extension-gets-support-for-mvc3/ 了解扩展程序附带的所有功能的列表。
    3. 默认情况下,它增加了对在请求结束后快速停用 InRequestScope 对象的支持。这可以防止负载很重的应用程序遇到 OutOfMemory 异常。
    4. 您帖子中的依赖解析器和上面的依赖解析器都有问题。在某些负载较重的情况下,您的应用程序会崩溃,并且只显示死机黄页,直到应用程序重新启动。我不喜欢仅仅因为使用了错误的依赖解析器而回答所有将来会出现的问题。将至少一个 .ToList() 添加到 GetServices
    5. 将在 Ninject 2.4 中移除对 InRequestScope 的支持,以移除对 System.Web 的依赖,从而减少构建目标的数量。这是一个突破性的变化。但是基于其中一个 Web 扩展的项目只需要进行非常简单的更改即可使其再次运行。 InRequestScope 仍可用于使用这些扩展之一的项目。自定义实现必须自己添加支持。

    【讨论】:

    • @Remo Gloor - Web.MVc 扩展和 Ninject.MVC3 有什么区别?
    • 是一样的。我们保留了 NuGet 包 Ninject.MVC3 的名称,因为它以前存在。
    • @Remo Gloor - 那么它是一样的吗?
    • @Remo Gloor - 我已有的代码有多少需要更改?
    • 无。只需删除nuget包添加的App_Start部分见github.com/ninject/ninject.web.mvc/wiki/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多