轉載:ASP.NET MVC4 NInject 使用示例教程


Ninject介紹:

Ninject是一個輕量級的基於.Net平台的依賴注入框架。
Ninject能夠幫助你把應用程序分離成一個個松耦合、高內聚的模塊,然后用一種靈活的方式組裝起來。通過使用Ninject配套你的軟件架構,那么代碼將會變得更加容易編寫、重用性強、易於測試和修改。

我們可以在ASP.NET MVC4 配合 Ninject 3 使用。

下載地址:http://www.ninject.org/

下面舉例說明:

ASP.NET MVC 的開發,獲取一個后台信息時的可能性示例代碼,有一個類實現了這個接口。

public interface IMessageProvider
{
string GetMessage();
}

public class NinjectMessageProvider : IMessageProvider
{
public string GetMessage()
{
return "This message was provided by Ninject";
}
}



ASP.NET MVC Controller的代碼:

public class HomeController : Controller
{
private IMessageProvider MessageProvider { set; get; }

public HomeController()
{
this.MessageProvider = new NinjectMessageProvider();
}

public ActionResult Index()
{
string message = this.MessageProvider.GetMessage();
return View( (object) message);
}

......
}



這里使用了構造函數來創建提供器對象實例。

如果每個頁面的實例都一個: Controller,我們必須重復的寫這樣的代碼,如果我們以后需要創建的提供器對象類型不再是 NinjectMessageProvider 類型了,就會導致大量的修改。

今天的 NInject 可以解決這問題。

2. 使用 NInject


先到官方網站下載相對應的版本。解壓Ninject.dll 的程序集,引用到項目中。


打開控制器的代碼文件,在前面使用 using 引用 Ninject 命名空間,這里使用了擴展方法。

using Ninject;
然后,將構造函數修改為如下所示:

public HomeController()
{
Ninject.IKernel ninjectKernel = new Ninject.StandardKernel();
ninjectKernel.Bind<IMessageProvider>()
.To<NinjectMessageProvider>();
this.MessageProvider = ninjectKernel.Get<IMessageProvider>();
}

這里的 Ninject.IKernel 是 Ninject 的核心。
依賴注入:
在每個控制器中,都這樣創建對象,還不如原來方便,好在 MVC 提供了依賴注入的入口,我們將現在的構造函數修改一下,支持構造函數注入。
public HomeController(IMessageProvider provider)
{
this.MessageProvider = provider;
}
然后,創建一個 NinjectDependencyResolver,實現 MVC 中提供的注入接口 IDependencyResolver,如下所示。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

using Ninject;
using MvcApplication1.Controllers;

namespace MvcApplication1
{
public class NinjectDependencyResolver
:System.Web.Mvc.IDependencyResolver
{
private Ninject.IKernel kernel;
public NinjectDependencyResolver()
{
this.kernel = new Ninject.StandardKernel();
this.AddBindings();
}

private void AddBindings()
{
this.kernel.Bind<IMessageProvider>()
.To<NinjectMessageProvider>();
}

public object GetService(Type serviceType)
{
return this.kernel.TryGet(serviceType);
}

public IEnumerable<object> GetServices(Type serviceType)
{
return this.kernel.GetAll(serviceType);
}
}
}
第三步,注冊這個容器。在 Global.asax 中,添加如下代碼。

System.Web.Mvc.DependencyResolver.SetResolver(
new MvcApplication1.NinjectDependencyResolver()
);

AreaRegistration.RegisterAllAreas();

WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);

重新運行程序,你會發現控制器已經能夠直接獲取消息提供器對象了。
其它說明:ASP.NET MVC 獲取控制器對象的時候,會發現需要為構造函數傳遞一個實現接口 IMessageProvider 的對象實例,Ninject 發現已經注冊的類型為 NinjectMessageProvider,那么,Ninject 就會自動幫助我們創建一個對象實例,再將這個對象實例傳遞到控制器中。
屬性注入:

如果控制器中沒有使用構造函數注入,而是使用了屬性注入呢?完全沒有問題,你只需要標注一個特性。注意:這個屬性的作用域必須是 public 的。

[Ninject.Inject]
public IMessageProvider MessageProvider { set; get; }


什么?你的這個成員是 private 的?沒有問題,設置一下,讓 Ninject 也可以注入非公共的成員就可以了。

public NinjectDependencyResolver()
{
this.kernel = new Ninject.StandardKernel();
this.kernel.Settings.InjectNonPublic = true;
this.AddBindings();
}

這樣,下面的成員也可以注入。

[Ninject.Inject]
private IMessageProvider MessageProvider { set; get; }
轉載:http://www.cyqdata.com/aspnetmvc/article-detail-54366




注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com