Asp.net mvc MVC 3依赖解析程序还是Ninject MVC插件?

Asp.net mvc MVC 3依赖解析程序还是Ninject MVC插件?,asp.net-mvc,asp.net-mvc-3,ninject,ninject-2,Asp.net Mvc,Asp.net Mvc 3,Ninject,Ninject 2,在MVC3中,他们添加了一个依赖解析程序,我一直在使用它。当回答某人的问题时,有人评论你应该使用Ninject MVC 3插件 所以我的问题是为什么要使用它而不是内置的?如果是这样的话,你怎么设置呢 以上是我回答的问题的链接 ASP.NET MVC 3提供了一个依赖项注入服务,它将连接到您选择实现的任何依赖项解析器中。Ninject MVC 3插件的功能非常简单,因为它所要做的就是实现中定义的类型解析方法,并调用适当的Ninject方法来返回请求的类型 无论您选择使用自己的IDependenc

在MVC3中,他们添加了一个依赖解析程序,我一直在使用它。当回答某人的问题时,有人评论你应该使用Ninject MVC 3插件

所以我的问题是为什么要使用它而不是内置的?如果是这样的话,你怎么设置呢


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

ASP.NET MVC 3提供了一个依赖项注入服务,它将连接到您选择实现的任何依赖项解析器中。Ninject MVC 3插件的功能非常简单,因为它所要做的就是实现中定义的类型解析方法,并调用适当的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]);
    }
}
公共类NinjectDependencyResolver:IDependencyResolver
{
私有只读IKernel_内核;
公共NinjectDependencyResolver(IKernel内核){
_内核=内核;
}
公共对象GetService(类型serviceType){
return _kernel.TryGet(serviceType,新的ipParameter[0]);
}
公共IEnumerable GetServices(类型serviceType){
return _kernel.GetAll(serviceType,新的ipParameter[0]);
}
}
这里的关键点是,ASP.NET MVC并没有提供一个成熟的依赖注入框架;它仅提供通过IoC容器(即Ninject)在ASP.NET MVC请求管道的特定点(控制器分辨率、视图分辨率等)检索所需类型实例所需的层


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

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

  • 既然已经有一个扩展在执行完全相同的操作,为什么还要实现自己的依赖项解析器呢?与其他实现相比,使用相同的实现可以在您遇到问题时更容易地为您提供支持。此外,使用相同的实现越多,它就越稳定。(见第4点)
  • 扩展不仅仅是依赖项解析程序。有关扩展插件附带的所有功能的列表,请参阅
  • 它增加了对请求默认结束后快速停用RequestScope中对象的支持。这可以防止负载较重的应用程序遇到OutOfMemory异常
  • 文章中的依赖项解析程序和上面的都有问题。在某些情况下,在重负载下,应用程序将崩溃,并且在应用程序重新启动之前只显示死亡黄页。我不想只因为使用了错误的依赖解析程序就回答将来会出现的所有问题。向GetServices至少添加一个.ToList()
  • Ninject 2.4将删除对InRequestScope的支持,以删除对System.Web的依赖,从而减少构建目标的数量。这是一个突破性的变化。但是基于其中一个Web扩展的项目只需要一个非常简单的更改就可以让它重新运行。InRequestScope仍将可用于使用这些扩展之一的项目。自定义实现必须自己添加支持

  • 这看起来和我现在拥有的差不多(见另一篇文章)。我听说(或者我想我听说)在没有mvc插件的情况下自己这样做不会在使用nhibernate时终止会话。@chobo2我对nhibernate或您描述的问题没有任何实际经验,因此我无法具体说明:[@chobo2,也许您指的是Ninject的
    OnePerRequestModule
    这将在请求结束后立即清除RequestScope中绑定的任何内容。它也将在运行任何其他EndRequest处理程序之前执行。不幸的是,您自己这样做并不能阻止这种情况发生。@Remo Gloor-我们之间有什么区别en Web.MVc extension和Ninject.MVC3?是一样的。我们保留了NuGet软件包Ninject.MVC3的名称,与以前的名称相同。@Remo-Gloor-那么它是一样的吗?@Remo-Gloor-我已经有多少代码需要更改?没有。只需删除NuGet软件包添加的App_Start部分,请参见