亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

[ASP.NET MVC 小牛之路]05

2019-11-17 01:28:40
字體:
來源:轉載
供稿:網友

[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應用程序時,你一定會喜歡上它的。

評論精選

#8樓[樓主] 2013-11-02 08:23 | Liam Wang @heren2013
引用public BookController(IBookRepository bookRepository) { repository = bookRepository; } 請問在哪里調用了這個構造函數,且構造函數中的參數在哪里初始化呢,難道ninjectKernel.Bind<IBookRepository>().To<BookRepository>();這段代碼就已經初始花了構造函數里的參數了嗎?求解
BookController類的創建(含初始化)主要經過下面這三個過程: 1.在Application_Start中,ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());這段注冊代碼告訴MVC用NinjectControllerFactory工廠類來創建所有Controller對象。 在NinjectControllerFactory類中包含了下面兩個過程:綁定接口到接口的實現和創建Controller類對象。 2.ninjectKernel.Bind<IBookRepository>().To<BookRepository>();這段綁定代碼告訴ninjectKernel當被請求一個IBookRepository接口的實現時則返回一個BookRepository對象。 3.請你閱讀NinjectControllerFactory類中的GetControllerInstance方法,通過ninjectKernel.Get(controllerType)這句代碼,ninject獲取controller(如BookController)對象的信息并創建該controller的實例,這個過程會調用controller的構造函數,它會自動判斷構造函數所需要的參數,如BookController類的構造函數需要一個IBookRepository接口參數,根據第2個過程ninject注冊的綁定,ninject會給該構造函數傳遞BookRepository對象(IBookRepository接口的實現者)的引用。
#19樓2013-11-28 09:57 | 彼年豆蔻 @Liam Wang 不需要啊,只需要在Application_Start()函數中注冊一下: DependencyResolver.SetResolver(new Code.NinjectDependencyResolver());//注冊Ioc容器 然后在具體使用中,Controller構造注入或者使用屬性注入即可 相關代碼:
namespace LvJl.WebMvc.Code{    public class NinjectDependencyResolver:System.Web.Mvc.IDependencyResolver    {        private readonly IKernel _kernel;        public NinjectDependencyResolver()        {            _kernel=new StandardKernel();            AddBindings();        }        private void AddBindings()        {            _kernel.Bind<
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美老女人性视频| 国产精品都在这里| 日本91av在线播放| 亚洲影院色在线观看免费| 欧美日韩国产中文字幕| 日韩精品在线免费| 2019中文字幕全在线观看| 国产精品91在线| 人妖精品videosex性欧美| 成人精品久久一区二区三区| 日韩av一区二区在线| 欧美—级高清免费播放| 久久久精品久久久久| 久久免费少妇高潮久久精品99| 国产精品普通话| 欧美激情亚洲一区| 国产精品高清网站| 亚洲国产精品成人一区二区| 亚洲电影在线看| 欧美成人精品激情在线观看| 亚洲精品98久久久久久中文字幕| 中文国产成人精品久久一| 久久久爽爽爽美女图片| 亚洲一区二区福利| 在线成人激情黄色| 黑人精品xxx一区| 91情侣偷在线精品国产| 精品久久久久久久久久久久久| 国产精彩精品视频| 亚洲成av人片在线观看香蕉| 一本大道亚洲视频| 91精品国产综合久久香蕉922| 日韩精品免费一线在线观看| 欧美在线视频在线播放完整版免费观看| 亚洲欧美另类在线观看| 国外色69视频在线观看| 在线丨暗呦小u女国产精品| 欧美激情影音先锋| 欧美激情亚洲自拍| 欧美色道久久88综合亚洲精品| 精品国产欧美成人夜夜嗨| 国产精品9999| 亚洲人高潮女人毛茸茸| 久久久久久网站| 亚洲精品自拍偷拍| 日韩欧美在线视频日韩欧美在线视频| 亚洲资源在线看| 亚洲精品视频中文字幕| 成人国产在线视频| 欧美亚洲视频在线观看| 国产精品av在线播放| 亚洲欧美一区二区精品久久久| 国产精品wwww| 久青草国产97香蕉在线视频| 亚洲欧美中文在线视频| 欧美交受高潮1| 5252色成人免费视频| 日韩欧美国产黄色| 国产精品一区二区久久精品| 久久久免费在线观看| 成人亚洲综合色就1024| 在线日韩日本国产亚洲| 欧美肥老妇视频| 日韩在线观看视频免费| 夜夜嗨av色一区二区不卡| 国产香蕉97碰碰久久人人| 亚洲欧美日韩天堂| 中文欧美在线视频| 国内精品国产三级国产在线专| 91av成人在线| 成人黄色激情网| 国产精品一区二区三区免费视频| 欧美成人免费在线视频| 欧美午夜视频一区二区| 欧美体内谢she精2性欧美| 91系列在线播放| 91午夜理伦私人影院| 亚洲一区二区三区久久| 欧美疯狂xxxx大交乱88av| 国产亚洲精品美女| 欧美激情一级二级| 日韩在线视频免费观看| 91在线观看免费观看| 国产精品视频男人的天堂| 国产亚洲一区精品| 亚洲欧美999| 国产91精品久久久| 日韩成人黄色av| 日韩极品精品视频免费观看| 日本亚洲欧洲色| 亚洲国产成人av在线| 91精品久久久久久久久久入口| 亚洲精品色婷婷福利天堂| 亚洲国产日韩欧美在线图片| 精品少妇一区二区30p| 欧美最猛性xxxxx亚洲精品| 国产97色在线|日韩| 国产视频精品自拍| 国产日韩精品视频| 欧美激情在线一区| 美女视频黄免费的亚洲男人天堂| 日韩精品视频在线| 欧美专区在线播放| 日韩欧美成人区| 国产精品久久久久久久av电影| 欧美国产日韩xxxxx| 91系列在线播放| xxxx欧美18另类的高清| 欧美一级片久久久久久久| 欧美日韩电影在线观看| 欧美日韩人人澡狠狠躁视频| 永久555www成人免费| 韩国国内大量揄拍精品视频| 1769国内精品视频在线播放| 国产亚洲精品91在线| 日韩精品高清在线观看| 成人福利网站在线观看| 日韩亚洲综合在线| 久久精品电影网站| 欧美一性一乱一交一视频| 国产精品久久综合av爱欲tv| 日韩的一区二区| 国产一区二区黑人欧美xxxx| 亚洲第一中文字幕| 久久久精品免费视频| 国产精品网址在线| 日韩高清电影免费观看完整版| 欧美性视频在线| 日韩欧美主播在线| 日韩在线视频线视频免费网站| 亚洲电影天堂av| 亚洲人成电影网| 4388成人网| 亚洲欧美制服中文字幕| 国产拍精品一二三| 国产精品91在线| 日韩小视频在线观看| 久久深夜福利免费观看| 91国自产精品中文字幕亚洲| 亚洲www在线| 欧美精品精品精品精品免费| 久久99久久99精品免观看粉嫩| 91在线观看免费高清完整版在线观看| 国产精品偷伦一区二区| 国产极品jizzhd欧美| 2019av中文字幕| 伊人青青综合网站| 亚洲免费一在线| 欧美夫妻性生活xx| 亚洲香蕉av在线一区二区三区| 久久久久久国产免费| 欧美日韩另类在线| 美女久久久久久久| 亚洲最新av在线| 日韩欧美一区二区三区| 国产三级精品网站| 川上优av一区二区线观看| 欧美激情亚洲视频| 国产精品99导航| 91久久久久久久久久| 91在线无精精品一区二区| 亚洲欧美日韩久久久久久| 91免费观看网站| 国产视频久久久久久久|