ASP.NET MVC3 + Ninject.Mvc3 依赖注入原来可以这么简单

来源:岁月联盟 编辑:exp 时间:2011-10-26

好久没有写文章了,懒。

今天收到一封邮件,是一位叫 HMQ 的同人,对我写过的 ASP.NET MVC3 依赖注入 的文章提出了问题,

当时我写这篇文章的时候,正式的 MVC3 版本还没有出来,当时我用的是 MVC3 Beta 版,而现在 MVC4 都快出来了,

因此这个 Demo 在当时的环境下是测试通过的,没有问题,而在现在的环境下可能会有问题(本人没有测试过),

如果哪天有时间,我会把这个 Demo 拿下来,进行适当的修改,让它适合当前的 MVC3 版本,不过话又说回来我觉得没有太大必要,

因为现在想在 ASP.NET MVC3 中使用依赖注入非常的简单,几乎用不了几行代码就可以实现依赖注入,我推荐使用 Ninject,

具体步骤如下:

 

第一步、新创建一个 ASP.NET MVC3 工程。

第二步、通过 NuGet 控制台直接输入命令:install-package Ninject.Mvc3

安装完这个源码包之后,所有的依赖注入框架已设置完成,无须你改动任何代码,

你会发现项目中添加了一个“App_Start”文件夹,在这个文件夹中生成了一个名为“NinjectMVC3.cs”的代码文件。

第三步、打开 /App_Start/NinjectMVC3.cs,找到 RegisterServices 方法,将你的依赖注入映射代码直接写入即可。

 

代码清单如下:

自动生成的 /App_Start/NinjectMVC3.cs代码:

[assembly: WebActivator.PreApplicationStartMethod(typeof(MvcApplication3.App_Start.NinjectMVC3), "Start")]

 [assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(MvcApplication3.App_Start.NinjectMVC3), "Stop")]

 

namespace MvcApplication3.App_Start

 {

     using System.Reflection;

     using Microsoft.Web.Infrastructure.DynamicModuleHelper;

     using Ninject;

     using Ninject.Web.Mvc;

     using MvcApplication3.Services;

     {

 

     public static class NinjectMVC3

         private static readonly Bootstrapper bootstrapper = new Bootstrapper();

 

         /// <summary>

        /// Starts the application

         /// </summary>

         public static void Start()

         {

             DynamicModuleUtility.RegisterModule(typeof(OnePerRequestModule));

             DynamicModuleUtility.RegisterModule(typeof(HttpApplicationInitializationModule));

             bootstrapper.Initialize(CreateKernel);

         }

        

         /// <summary>

        /// Stops the application.

         /// </summary>

         public static void Stop()

         {

             bootstrapper.ShutDown();

         }

        

         /// <summary>

        /// Creates the kernel that will manage your application.

         /// </summary>

        /// <returns>The created kernel.</returns>

         private static IKernel CreateKernel()

         {

             var kernel = new StandardKernel();

             RegisterServices(kernel);

             return kernel;

         }

 

         /// <summary>

        /// Load your modules or register your services here!

         /// </summary>

        /// <param name="kernel">The kernel.</param>

         private static void RegisterServices(IKernel kernel)

         {

             //写入你需要绑定的依赖注入关系,除了此方法之外的其它代码都是自动生成的,无须我们操心。

             kernel.Bind<ITestService>().To<TestService>();

         }       

     }

 }

 

测试代码如下:

/Services/ITestService.cs

namespace MvcApplication3.Services

 {

     public interface ITestService

     {

         string GetMessage(string aString);

     }

 }

 

/Services/TestService.cs

using System;

 

namespace MvcApplication3.Services

 {

     public class TestService : ITestService

     {

         string ITestService.GetMessage(string aString)

         {

             return "--------------" + (String.IsNullOrEmpty(aString) ? String.Empty : aString) + "--------------";

         }

     }

 }

 

/Controllers/HomeController.cs

using System.Web.Mvc;

using Ninject;

using MvcApplication3.Services;

 

namespace MvcApplication3.Controllers

 {

     public class HomeController : Controller

     {

 

         [Inject]

         public ITestService Service { get; set; }

 

         public ActionResult Index()

         {

             ViewBag.Message = Service.GetMessage("Welcome to ASP.NET MVC!");

             return View();

         }

 

         public ActionResult About()

         {

             return View();

         }

 

     }

 }

 

在此基础上我们自己可以进行一些优化,从而使依赖注入使用起来更加方便, 更适合团队开发,

随便说一句 NuGet 真是不错,应该好好利用,本来想把源代码传上来,可惜网速很慢,根本传不上来,

如果有需要Demo源码的,留下你的 email ,如果我看到的话,会发给你,不过我相信大家根本用不着。

 

作者:老马快跑