MVC依赖注入

时间:2011-12-23 05:09:10

标签: asp.net-mvc asp.net-mvc-4 dependency-injection

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

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

3 个答案:

答案 0 :(得分:5)

我在MVC 4 Beta项目中成功使用了Ninject.MVC3 NuGet包。

// 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);
}

答案 1 :(得分:2)

我不知道MVC 4(我还没有机会玩它)但我会推荐Ninject作为DI容器。您可以在解决方案中安装Ninject MVC3项目(来自nuget),它可能只适用于MVC4 如果不使用:

DependencyResolver.SetResolver(new NinjectDependencyResolver(myKernal));     

在这里发表了博客http://blogs.microsoft.co.il/blogs/gilf/archive/2010/10/17/dependency-injection-in-mvc-3-was-made-easier.aspx

博客文章适用于Unity,但它与Ninject几乎相同,实现了一个Dependancy Resolver来包装ninject并将其放入global.ascx文件

答案 2 :(得分:0)

出于某种原因,使用NinjectDependencyResolver的Ninject对我来说不适用于MVC4(开发者预览版)。

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

IKernel kernel = new StandardKernel();    
kernel.Bind<...>().To(...);
DependencyResolver.SetResolver( t => kernel.Get(t), t => kernel.GetAll(t) );