Asp.net mvc MVC依赖注入

Asp.net mvc MVC依赖注入,asp.net-mvc,asp.net-mvc-4,dependency-injection,Asp.net Mvc,Asp.net Mvc 4,Dependency Injection,我正在启动一个使用MVC4的新项目,并希望使用依赖注入。我过去没有用过,但现在似乎是使用它的好时机 谁能告诉我哪些DI工具现在支持MVC4,哪些工具现在提供了最简单的设置。我需要一个相当简单的项目,因为是小。对我来说,最重要的是一个易于学习和配置的系统。我不知道MVC4(我只是还没有机会使用它),但我推荐Ninject作为DI容器。您可能只需要在解决方案中安装Ninject MVC3项目(来自nuget),它很可能只与MVC4一起工作 如果不使用: DependencyResolver.SetR

我正在启动一个使用MVC4的新项目,并希望使用依赖注入。我过去没有用过,但现在似乎是使用它的好时机

谁能告诉我哪些DI工具现在支持MVC4,哪些工具现在提供了最简单的设置。我需要一个相当简单的项目,因为是小。对我来说,最重要的是一个易于学习和配置的系统。

我不知道MVC4(我只是还没有机会使用它),但我推荐Ninject作为DI容器。您可能只需要在解决方案中安装Ninject MVC3项目(来自nuget),它很可能只与MVC4一起工作 如果不使用:

DependencyResolver.SetResolver(new NinjectDependencyResolver(myKernal));     
这是我在博客上写的

这篇博文适用于unity,但对于Ninject几乎是一样的,实现一个依赖解析程序来包装Ninject并将其放入global.ascx文件中

我不知道MVC4(我只是还没有机会玩它),但我推荐Ninject作为DI容器。您可能只需要在解决方案中安装Ninject MVC3项目(来自nuget),它很可能只与MVC4一起工作 如果不使用:

DependencyResolver.SetResolver(new NinjectDependencyResolver(myKernal));     
这是我在博客上写的


这篇博文适用于unity,但对于Ninject几乎相同,实现一个依赖解析程序来包装Ninject,并将其放入global.ascx文件中

,因为某些原因,使用Ninject依赖解析程序的Ninject在MVC4(开发者预览)中不适用

我使用另一个SetResolver重载解决了这个问题,使用了两个匿名函数来解析依赖关系

IKernel kernel = new StandardKernel();    
kernel.Bind<...>().To(...);
DependencyResolver.SetResolver( t => kernel.Get(t), t => kernel.GetAll(t) );
IKernel内核=新的标准内核();
kernel.Bind()到(…);
SetResolver(t=>kernel.Get(t),t=>kernel.GetAll(t));

由于某种原因,使用NinjectDependencyResolver的Ninject在MVC4(开发人员预览)中不适用

我使用另一个SetResolver重载解决了这个问题,使用了两个匿名函数来解析依赖关系

IKernel kernel = new StandardKernel();    
kernel.Bind<...>().To(...);
DependencyResolver.SetResolver( t => kernel.Get(t), t => kernel.GetAll(t) );
IKernel内核=新的标准内核();
kernel.Bind()到(…);
SetResolver(t=>kernel.Get(t),t=>kernel.GetAll(t));

我在MVC4测试版项目中成功地使用了Ninject.mvc3nuget包

// Global.asax.cs

public static void Configure(HttpConfiguration config)
{
    var kernel = new StandardKernel();
    RegisterServices(kernel);

    // For ApiControllers
    config.ServiceResolver.SetResolver(
        t => kernel.TryGet(t),
        t => kernel.GetAll(t));

    // For Controllers
    DependencyResolver.SetResolver(
        t => kernel.TryGet(t),
        t => kernel.GetAll(t));
}

public static void RegisterServices(IKernel kernel)
{
    kernel.Bind<IRepository>().To<Repository>();
}

protected void Application_Start()
{
    ...

    Configure(GlobalConfiguration.Configuration);
}
//Global.asax.cs
公共静态无效配置(HttpConfiguration配置)
{
var kernel=新的标准内核();
注册服务(内核);
//对于APIController
config.servicesolver.SetResolver(
t=>kernel.TryGet(t),
t=>kernel.GetAll(t));
//控制器
DependencyResolver.SetResolver(
t=>kernel.TryGet(t),
t=>kernel.GetAll(t));
}
公共静态无效注册服务(IKernel内核)
{
kernel.Bind().To();
}
受保护的无效应用程序\u Start()
{
...
配置(GlobalConfiguration.Configuration);
}

我在MVC4测试版项目中成功地使用了Ninject.mvc3nuget包

// Global.asax.cs

public static void Configure(HttpConfiguration config)
{
    var kernel = new StandardKernel();
    RegisterServices(kernel);

    // For ApiControllers
    config.ServiceResolver.SetResolver(
        t => kernel.TryGet(t),
        t => kernel.GetAll(t));

    // For Controllers
    DependencyResolver.SetResolver(
        t => kernel.TryGet(t),
        t => kernel.GetAll(t));
}

public static void RegisterServices(IKernel kernel)
{
    kernel.Bind<IRepository>().To<Repository>();
}

protected void Application_Start()
{
    ...

    Configure(GlobalConfiguration.Configuration);
}
//Global.asax.cs
公共静态无效配置(HttpConfiguration配置)
{
var kernel=新的标准内核();
注册服务(内核);
//对于APIController
config.servicesolver.SetResolver(
t=>kernel.TryGet(t),
t=>kernel.GetAll(t));
//控制器
DependencyResolver.SetResolver(
t=>kernel.TryGet(t),
t=>kernel.GetAll(t));
}
公共静态无效注册服务(IKernel内核)
{
kernel.Bind().To();
}
受保护的无效应用程序\u Start()
{
...
配置(GlobalConfiguration.Configuration);
}

您建议使用ninject但不粘贴unity code?:)还有unity.mvc3,但您必须明确告诉它,何时您希望它使用HierarchyCallifeTimeManager来处理对象。本文更多地介绍了如何将任何DI容器与mvc3一起使用,就我个人而言,我使用Ninject.Web.MVC3提供的webactivator工具,但另一个选择是使用内置依赖解析程序自己完成。我更新了代码示例,说Ninject(但实际上并没有什么不同),您推荐Ninject,但粘贴unity代码吗?:)还有unity.mvc3,但您必须明确告诉它,何时您希望它使用HierarchyCallifeTimeManager来处理对象。本文更多地介绍了如何将任何DI容器与mvc3一起使用,就我个人而言,我使用Ninject.Web.MVC3提供的webactivator工具,但另一个选择是使用内置依赖解析程序自己完成。我更新了代码示例,说Ninject(但实际上并没有什么不同),我刚刚发现,当从ApiController派生的控制器发出请求时,使用ServiceResolver.SetResolver可以很好地工作,但会导致“没有为该对象定义无参数构造函数”向从控制器派生的控制器发出请求时出错。正如Jason Cornwall所说,“ApiController的IDependencyResolver是一种完全不同的类型,并且在不同的解析器上“设置”。如果您使用MVC 4 RC,请在不同的SO线程上进行检查。我刚刚发现,当向从ApiController派生的控制器发出请求时,使用ServiceResolver.SetResolver可以正常工作,但会导致错误“没有为此对象定义无参数构造函数。”向从控制器派生的控制器发出请求时出错。正如Jason Cornwall所说,“用于ApiControllers的IDependencyResolver是完全不同的类型,并且在不同的解析程序上“设置”。“如果您使用的是MVC 4 RC,请在不同的SO线程上签出。”。