好久沒有寫文章了,懶。
今天收到一封郵件,是一位叫 HMQ 的同人,對我寫過的 ASP.NET MVC3 依賴注入 的文章提出了問題,
當(dāng)時我寫這篇文章的時候,正式的 MVC3 版本還沒有出來,當(dāng)時我用的是 MVC3 Beta 版,而現(xiàn)在 MVC4 都快出來了,
因此這個 Demo 在當(dāng)時的環(huán)境下是測試通過的,沒有問題,而在現(xiàn)在的環(huán)境下可能會有問題(本人沒有測試過),
如果哪天有時間,我會把這個 Demo 拿下來,進(jìn)行適當(dāng)?shù)男薷模屗m合當(dāng)前的 MVC3 版本,不過話又說回來我覺得沒有太大必要,
因為現(xiàn)在想在 ASP.NET MVC3 中使用依賴注入非常的簡單,幾乎用不了幾行代碼就可以實現(xiàn)依賴注入,我推薦使用 Ninject,
具體步驟如下:
第一步、新創(chuàng)建一個 ASP.NET MVC3 工程。
第二步、通過 NuGet 控制臺直接輸入命令:install-package Ninject.Mvc3
安裝完這個源碼包之后,所有的依賴注入框架已設(shè)置完成,無須你改動任何代碼,
你會發(fā)現(xiàn)項目中添加了一個“App_Start”文件夾,在這個文件夾中生成了一個名為“NinjectMVC3.cs”的代碼文件。
第三步、打開 \App_Start\NinjectMVC3.cs,找到 RegisterServices 方法,將你的依賴注入映射代碼直接寫入即可。
代碼清單如下:
自動生成的 \App_Start\NinjectMVC3.cs 代碼:
[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)
{
//寫入你需要綁定的依賴注入關(guān)系,除了此方法之外的其它代碼都是自動生成的,無須我們操心。
//2011-10-26 新修復(fù) bug,遺漏了后面的 InRequestScope(),這個很重要!
//感謝 Scott Xu 南方小鬼 的指錯:),差點誤人子弟啊!
kernel.Bind<ITestService>().To<TestService>().InRequestScope();
}
}
}
測試代碼如下:
\Services\ITestService.cs
{
public interface ITestService
{
string GetMessage(string aString);
}
}
\Services\TestService.cs
namespace MvcApplication3.Services
{
public class TestService : ITestService
{
string ITestService.GetMessage(string aString)
{
return "--------------" + (String.IsNullOrEmpty(aString) ? String.Empty : aString) + "--------------";
}
}
}
\Controllers\HomeController.cs
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();
}
}
}
在此基礎(chǔ)上我們自己可以進(jìn)行一些優(yōu)化,從而使依賴注入使用起來更加方便, 更適合團(tuán)隊開發(fā),
隨便說一句 NuGet 真是不錯,應(yīng)該好好利用。
源碼下載:Ninect.Mvc3_Demo.zip(環(huán)境:VS2010 SP1 + MVC3)
浙公網(wǎng)安備 33010602011771號