[ASP.NET MVC 小牛之路]05 - 使用 Ninject

來源:互聯網
上載者:User

[ASP.NET
MVC 小牛之路]05 - 使用 Ninject

在[ASP.NET MVC 小牛之路]系列上一篇文章(依賴注入(DI)和Ninject)的末尾提到了在ASP.NET
MVC中使用Ninject要做的兩件事情,續這篇文章之後,本文將用一個實際的樣本來示範Ninject在ASP.NET MVC中的應用。

為了更好的理解和撐握本文內容,強烈建議初學者閱讀本文前先閱讀依賴注入(DI)和Ninject。

本文目錄:


準備工作

建立一個名為BookShop的空白解決方案。在該解決方案中分別添加一個名為BookShop.WebUI的MVC空應用程式,和一個名為BookShop.Domain的類庫工程。目錄結構如下:

兩個工程添加完後,在BookShop.WebUI工程下添加BookShop.Domain工程的引用。

使用NuGet分別為BookShop.WebUI工程和BookShop.Domain工程安裝Ninject包(NuGet的介紹請閱讀依賴注入(DI)和Ninject)。可以通過可視化視窗安裝,也可以開啟Package
Manager Console(視圖->其他視窗->Package Manager Console)執行下面命令安裝:

Install-Package Ninject -Project BookShop.WebUI

Install-Package Ninject -Project BookShop.Domain

說明安裝成功:

建立Controller Factory

我們知道,在ASP.NET MVC中,一個用戶端請求是在特定Controller的Action中進行處理的。 預設情況下,ASP.NET MVC使用內建的Controller工廠類 DefaultControllerFactory來建立某個請求對應的Controller執行個體。有時候預設的Controller工廠不能滿足我們實際的需求,我們就需要對這種預設行為進行擴充,即建立一個繼承自DefaultControllerFactory類的自訂Controller工廠類並重寫其中的一些方法。為此,我們在BookShop.WebUI工程下建立一個名為Infrastructure的檔案夾,在該檔案夾中添加一個名為NinjectControllerFactory的工廠類,代碼如下:

public class NinjectControllerFactory : DefaultControllerFactory {    private IKernel ninjectKernel;    public NinjectControllerFactory() {        ninjectKernel = new StandardKernel();        AddBindings();    }    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) {        return controllerType == null ? null : (IController)ninjectKernel.Get(controllerType);    }    private void AddBindings() {        // todo:後面再來添加綁定    }}

上面代碼中的 ninjectKernel.Get(controllerType) 可擷取到一個Controller執行個體。在這裡如果手動執行個體化Controller類是一個非常複雜的過程,我們不知道Controller類有沒有帶參數的建構函式,也不知道建構函式的參數是什麼類型。而使用Ninject只需要使用上面的一個Get方法就可以,Ninject內部會自動處理所有的依賴關係,智能地建立我們需要的對象。

Controller工廠類建立好後,我們就需要告訴MVC用我們的NinjectControllerFactory類來建立Controller對象,為此,需在Global.asax檔案的Application_Start方法中添加下面代碼:

protected void Application_Start() {    ......    //設定Controller工廠    ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());}

這裡我們暫且不去關心上面這段代碼是什麼原理,知道設定自訂的Controller工廠必須要在這註冊就行了,有空的話我會在後續博文對這部分內容進行更深入的講解。


添加Domain Model

在MVC應用程式中,一切都是圍繞Domain Model(領域模型)來的。 所以我們在BookShop.Domain工程中專門建一個名為Entities的檔案夾,用來存放領域實體模型。作為一個電子商務類的網上書店,當然最重要的一個領域實體就是Book了。由於只是為了示範,我們簡單定義一個Book類,並在Entities檔案夾中添加該類,代碼如下:

public class Book {    public int ID { get; set; }    public string Title { get; set; }    public string Isbn { get; set; }    public string Summary { get; set; }    public string Author { get; set; }    public byte[] Thumbnail { get; set; }    public decimal Price { get; set; }    public DateTime Published { get; set; }}

添加Repository

我們知道,我們肯定需要一種方式來從資料庫中讀取Book資料。在這我們不防為資料的使用者(這裡指Controller)提供一個IBookRepository介面,在這個介面中聲明一個IQueryable<Book>類型的屬性Books。這樣,通過該介面使用依賴注入,使用者就可以拿到Books資料集合,而不用關心資料是如何得到的。為此,我們在BookShop.Domain工程中添加一個名為 Abstract的檔案夾,在該檔案夾中添加我們的IBookRepository介面檔案,代碼如下:

public interface IBookRepository {    IQueryable<Book> Books { get; }}

在MVC中我們一般會用倉儲模式(Repository Pattern)把資料相關的邏輯和領域實體模型分離,這樣對於使用者來說,通過調用倉儲對象,使用者可以直接拿到自己想要的資料,而完全不必關心資料具體是如何來的。我們可以把倉儲比喻成一個超市,超市已經為消費者供備好了商品,消費者只管去超市選購自己需要的商品,而完全不必關心這些商品是從哪些供應商怎麼樣運輸到超市的。但對於倉儲本身,必須要實現讀取資料的“渠道”。

在BookShop.Domain工程中添加一個名為Concrete檔案夾用於存放具體的類。我們在Concrete檔案夾中添加一個實現了IBookRepository介面的BookRepository類來作為我們的Book資料倉儲。BookRepository類代碼如下:

public class BookRepository : IBookRepository {    public IQueryable<Book> Books {        get { return GetBooks().AsQueryable(); }    }    private static List<Book> GetBooks() {          //為了示範,這裏手工造一些資料,後面會介紹使用EF從資料庫中讀取。        List<Book> books = new List<Book>{            new Book { ID = 1, Title = "ASP.NET MVC 4 編程", Price = 52},            new Book { ID = 2, Title = "CLR Via C#", Price = 46},            new Book { ID = 3, Title = "平凡的世界", Price = 37}        };        return books;    }}

為了示範,上面是手工造的一些資料,後面的文章我將介紹使用Entity Framwork從資料庫中讀取資料。對於剛接觸ORM架構的朋友可能對這裡IQueryable感到奇怪,為什麼用IQueryable作為傳回型別,而不用IEnumerable呢?後面有機會講Entity Framwork的時候再講。

添加綁定

開啟之前我們在BookShop.WebUI工程建立的NinjectControllerFactory類,在AddBindings方法中添加如下代碼

private void AddBindings() {    ninjectKernel.Bind<IBookRepository>().To<BookRepository>();}

這句代碼,通過Ninject把IBookRepository介面綁定到BookRepository,當IBookRepository介面的實現被請求時,Ninject將自動建立BookRepository類的執行個體。

到這裡,Ninject的使用步驟就結束了,接下來我們把本樣本剩餘的步驟完成。


顯示列表

右擊BookShop.WebUI工程的Controllers檔案夾,添加一個名為Book的Controller,按下面代碼對其進行編輯:

public class BookController : Controller {    private IBookRepository repository;    public BookController(IBookRepository bookRepository) {        repository = bookRepository;    }}

在這,BookController的建構函式接受了一個IBookRepository參數,當BookController被執行個體化的時候,Ninject就為其注入了BookRepository的依賴。接下來我們為這個Controller添加一個名為List的Action,用來呈現Book列表。代碼如下:

public class BookController : Controller {    ...    public ViewResult List() {        return View(repository.Books);    }}

當然我們需要添加一個View。右擊上面的List方法,選擇添加視圖,在彈出的視窗進行如下配置:

然後我們在List.cshtml中用foreach迴圈來列舉書本資訊,代碼如下:

@model IEnumerable<BookShop.Domain.Entities.Book>@{    ViewBag.Title = "Books";}@foreach (var p in Model) {      <div class="item" style="border-bottom:1px dashed silver;">         <h3>@p.Title</h3>         <p>價格:@p.Price.ToString("c") </p>       </div>     }

最後我們還需要修改一下預設路由,讓系統運行後直接導向到我們的{controller = "Book", action = "List"},開啟Global.asax檔案,找到RegisterRoutes方法,進行如下修改:

public static void RegisterRoutes(RouteCollection routes) {    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");    routes.MapRoute(        "Default", // Route name         "{controller}/{action}/{id}", // URL with parameters         new { controller = "Book", action = "List", id = UrlParameter.Optional }    );}

到這,我們的程式可以運行了,效果如下:

結束語:

本文是Ninject在ASP.NET MVC中使用的一個簡單樣本,目的是讓大家瞭解Ninject在MVC中的使用方法。當然,Ninject的強大之處不僅限於本文所示範的,相信當你熟悉了Niject之後,在搭建MVC應用程式時,你一定會喜歡上它的。

以上就是[ASP.NET MVC 小牛之路]05 - 使用 Ninject的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.