日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

在MVC3项目中结合NInject实现依赖注入

發(fā)布時(shí)間:2025/3/17 c/c++ 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在MVC3项目中结合NInject实现依赖注入 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

解釋:

依賴注入:(Dependency Injection),也稱之為控制反轉(zhuǎn)。

大致意思就是,讓我們的應(yīng)用程序所依賴的一些外部服務(wù),可以根據(jù)需要?jiǎng)討B(tài)注入,而不是預(yù)先在應(yīng)用程序中明確的約束.這種思想在當(dāng)前軟件開發(fā)領(lǐng)域,為了保證軟件架構(gòu)靈活性和可便于維護(hù)性,應(yīng)該說是很有意義的。在MVC框架中,為依賴注入的設(shè)計(jì)提供了先天的支持。結(jié)合一些我們熟知的DI組建,比如Unity,Ninject等等。可以較為容易的實(shí)現(xiàn)上述提到的功能。

?

場景介紹:
我們的應(yīng)用程序,需要支持各種不同的數(shù)據(jù)源,而且我們希望日后可以很容易地切換,不會因?yàn)閿?shù)據(jù)源的變化而導(dǎo)致對Contoller或者Model,或者View做修改。

第一步準(zhǔn)備一個(gè)MVC項(xiàng)目(選擇空模板)

第二步準(zhǔn)備一個(gè)實(shí)體模型

using System; using System.Collections.Generic; using System.Linq; using System.Text;namespace SportsStore.Domain.Entities {public class Employee{public int ID { get; set; }public string FirstName { get; set; }public string LastName { get; set; }} }

第三步:定義一個(gè)數(shù)據(jù)訪問接口

using System; using System.Collections.Generic; using System.Linq; using System.Text; using SportsStore.Domain.Entities;namespace SportsStore.Domain.Abstract {public interface IEmployeeRepository{IQueryable<Employee> Employees { get; }} }

第四步:添加一個(gè)HomeController

public class HomeController : Controller{//// GET: /Home/public ActionResult Index(){return View();}}

注意,這里需要為HomeController添加一個(gè)特殊的構(gòu)造函數(shù),傳入IEmployeeRepository這個(gè)接口。通常,所有的DI組件都是通過這樣的方式注入的。
在設(shè)計(jì)HomeController的時(shí)候,我們不需要關(guān)心到底日后會用具體的哪種IEmployeeRepository,我們只是要求要傳入一個(gè)IEmployeeRepository的具體實(shí)現(xiàn)就可以了,這就是DI的本質(zhì)了。

?

到這里為止,我們該做的準(zhǔn)備工作基本就緒了。下面來看看如何結(jié)合DI組件來實(shí)現(xiàn)我們的需求

第五步:引入NInject組件


這是我比較喜歡的一個(gè)DI組件。它還針對MVC3專門有一個(gè)擴(kuò)展

第六步:創(chuàng)建一個(gè)IEmployeeRepository的具體實(shí)現(xiàn)

using System; using System.Collections.Generic; using System.Linq; using System.Text; using SportsStore.Domain.Abstract; using SportsStore.Domain.Entities;namespace SportsStore.Domain.Concrete {public class EmployeeRepository : IEmployeeRepository{public IQueryable<Employee> Employees{get{return new[] { new Employee { ID = 1, FirstName = "ICEY", LastName = "chen" } }.AsQueryable();}}} }

第七步:實(shí)現(xiàn)注入,通過擴(kuò)展MVC組件實(shí)現(xiàn)

第一種:實(shí)現(xiàn)自定義ControllerFactory

?

我們都知道,Controller其實(shí)都是由ControllerFactory來生成的,那么,為了給所有新創(chuàng)建從Controller都自動(dòng)注入我們的服務(wù),那么就可以從ControllerFactory這個(gè)地方動(dòng)動(dòng)腦筋了。

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using Ninject; using Moq; using SportsStore.Domain.Abstract; using SportsStore.Domain.Entities; using SportsStore.Domain.Concrete; using System.Configuration; using SportsStore.WebUI.Infrastructure.Abstract; using SportsStore.WebUI.Infrastructure.Concrete;namespace SportsStore.WebUI.Infrastructure {/// <summary>/// 使用Ninject生成mvc應(yīng)用程序controller并處理DI/// </summary>public class NinjectControllerFactory:DefaultControllerFactory{private IKernel ninjectKernel;public NinjectControllerFactory(){ninjectKernel = new StandardKernel();AddBindings();}protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType){return controllerType == null? null: (IController)ninjectKernel.Get(controllerType);}private void AddBindings(){ninjectKernel.Bind<IEmployeeRepository>().To<EmployeeRepository>();}} }

要使用這個(gè)自定義的?ControllerFactory,我們需要修改Global.ascx文件中的Application_Start方法,添加下面的代碼

ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());

這樣做好之后,我們可以測試HomeController中的Index這個(gè)Action,我們發(fā)現(xiàn)它還是能正常工作。

修改HomeController中的Index

public class HomeController : Controller{private IEmployeeRepository repository;public HomeController(IEmployeeRepository employeeRepository){repository = employeeRepository;}public ActionResult Index(){return View(repository.Employees);}}

運(yùn)行程序,我們發(fā)現(xiàn)程序能很好的工作了。

第二種:實(shí)現(xiàn)自定義的DependencyResolver

?

顧名思義,這就是MVC框架里面專門來處理所謂的依賴項(xiàng)的處理器。可以說這是MVC專門為DI準(zhǔn)備的一個(gè)后門。下面是我寫好的一個(gè)例子

public class NinjectDependencyResolver : IDependencyResolver{private IKernel kernel;public NinjectDependencyResolver(){kernel = new StandardKernel();AddBindings();}public object GetService(Type serviceType){return kernel.TryGet(serviceType);}public IEnumerable<object> GetServices(Type serviceType){return kernel.GetAll(serviceType);}public IBindingToSyntax<T> Bind<T>(){return kernel.Bind<T>();}public IKernel Kernel{get { return kernel; }}private void AddBindings(){Bind<IEmployeeRepository>().To<EmployeeRepository>();}}

那么,如何使用這個(gè)自定義的處理器呢?


很簡單,我們?nèi)匀皇切薷?span style="font-family:Tahoma;">Global.asax文件中的Application_Start方法 DependencyResolver.SetResolver(new NinjectDependencyResolver());

請注意,之前那個(gè)設(shè)置ControllerFactory的代碼,我們可以注釋掉了

?

?

至此,Ninject注入容器完全融入MVC的心臟了。

?

轉(zhuǎn)載于:https://www.cnblogs.com/crystal159/archive/2012/07/11/2586306.html

總結(jié)

以上是生活随笔為你收集整理的在MVC3项目中结合NInject实现依赖注入的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。