ASP.NET MVC使用Ninject的方法教程
為什么要使用Ninject?
很多其它類(lèi)型的IOC容器過(guò)于依賴配置文件,老是配置,總感覺(jué)有點(diǎn)不爽,而且要使用assembly-qualified名稱(也就是類(lèi)型的全名)來(lái)進(jìn)行定義,稍不注意就會(huì)因?yàn)榇蝈e(cuò)字而令整個(gè)程序崩掉。Ninject是一個(gè)快如閃電、超輕量級(jí)的基于.Net平臺(tái)的IOC容器,主要用來(lái)解決程序中模塊的耦合問(wèn)題,它的目的在于做到最少配置。因此如果你不喜歡配置,不喜歡重量級(jí)IOC框架,那么就用小蘋(píng)果Ninject吧!
Ninject是一個(gè)快如閃電的,輕量級(jí)的。。。。。依賴注入框架,呃呃呃,貌似很少用到,Ninject就是一個(gè)DI容器,作用是對(duì)ASP.NET MVC程序中的組件進(jìn)行解耦 ,說(shuō)到解耦其實(shí)也有其他的方式可以達(dá)到解耦這個(gè)目的,比如接口
public interface ITest { Decimal ValueProducts(IEnumerable<Product>products) ; } public class Test:ITest { public Decimal ValueProducts(IEnumerable<Product>products) { return products.sum(p=>p.Price); } } public class ShoppingCart { private ITest test; public IEnumerable<Product>products{set;get;} public ShoppingCart( ITest test) { this.test=test; } public Decimal result(products); }
通過(guò)接口可以說(shuō)達(dá)到了我們想要的結(jié)果,也就是Shopping和Test之間的耦合。但是在控制器中卻沒(méi)辦法達(dá)到這個(gè)目的
public ActionResult Index(){ ITest IT=new Test(); ShoppingCart cart=new ShoppingCart(IT);{Products=products}; Decimal total=IT.result(); return View(total); }
我們只能借助Ninject來(lái)幫我們實(shí)現(xiàn)
可以通過(guò)nuget下載Ninect也可以通過(guò)Ninject下載
那么我們?cè)撛趺词褂肗inject幫我們解決上述的問(wèn)題呢?
其實(shí)使用Ninect不難,一共三個(gè)步驟:
//在控制器 public ActionResult Index() { 1:創(chuàng)建一個(gè)Ninject的內(nèi)核 IKernel ninject=new StandardKernel(); 2:就是配置Ninject內(nèi)核,其實(shí)就是將實(shí)現(xiàn)類(lèi)和接口類(lèi)綁定在一起 ninject.Bind<ITest>().To<Test>(); 3:最后一步就是使用Ninject創(chuàng)建一個(gè)對(duì)象了 ITest IT=ninject.Get<ITest>(); }
從創(chuàng)建內(nèi)核到創(chuàng)建對(duì)象跟Spring.Net倒是很相似。
可能有點(diǎn)點(diǎn)強(qiáng)迫癥吧,覺(jué)得這么一坨東西放在那里好礙眼吖,不可能叫我每一個(gè)動(dòng)作里面都寫(xiě)這一坨東西吧,當(dāng)然不是。
下面就創(chuàng)建一個(gè)依賴項(xiàng)解析器(好像很高大上一樣,其實(shí)就是將上面的代碼做個(gè)封裝而已)
public class NinjectResolver:IDependencyResolver { private IKernel kernel; public NinjectResolver(IKernel kernel) { this.kernel=kernel; AddBinding(); } public IEnumerable<Object> GetServices(Type serviceType) { return kernel.GetAll(serviceType); } public Object GetService(Type serviceType) { return kernel.TryGet(serviceType); } void AddBinding() { kernel.Bind<ITest>().To<Test>(); } }
IDependencyResolver這個(gè)是System.Mvc里面的繼承這個(gè)接口必須實(shí)現(xiàn)GetServices和GetService,AddBinding這個(gè)方法是用來(lái)綁定實(shí)現(xiàn)類(lèi)和接口
GetService方法中的TryGet類(lèi)似于上面的Get,當(dāng)沒(méi)有合適的綁定時(shí),這個(gè)會(huì)返回一個(gè)null值,不會(huì)拋異常,而GetServices方法中的GetAll對(duì)單一類(lèi)型的多個(gè)綁定時(shí),可以用到這個(gè)
最后一步就是在App_Start這一個(gè)文件夾中找到NinjectWebCommon.cs這個(gè)文件再找到 RegisterServices(IKernel kernel)這個(gè)方法添加System.Web.Mvc.DependencyResolver.SetResolver(newNinjectResolver(kernel));
這時(shí)候我們修改下控制器中的代碼
private ITest test; public HomeController(ITest test) { this.test=test; } public ActionResult Index(){ ShoppingCart cart=new ShoppingCart(IT);{Products=products}; Decimal total=IT.result(); return View(total); }
Ninject大概的用法也差不多了,下面說(shuō)的時(shí)Ninject比較新穎的東西
就是指定屬性或者構(gòu)造函數(shù)傳值了,其實(shí)也沒(méi)什么,只是WithConstructorArgument和WithPropertyValue這兩個(gè)的使用
public interface IHelper { Decimal ApplyDiscount(Decimal totalParam); } public class Helper : IHelper { public Decimal DiscountSize { set; get; } public decimal ApplyDiscount(decimal totalParam) { return (totalParam - (discountparam / 100m * totalParam)); } }
private void AddBindings() { kernel.Bind<ITest>().To<Test>(); kernel.Bind<IHelper>().To<Helper>().WithPropertyValue("DiscountSize", 50M); kernel.Bind<IHelper>().To<Helper>().WithConstructorArgument("discountparam", 50M); }
WithPropertyValue這個(gè)有兩個(gè)參數(shù)一個(gè)是屬性名,一個(gè)是屬性值,這樣子可以一開(kāi)始就給這個(gè)屬性賦值上默認(rèn)值,個(gè)人感覺(jué)作用倒是不大,也有其他的方法可以實(shí)現(xiàn)同樣效果
WithConstructorArgument這個(gè)也差不多,參數(shù)一是構(gòu)造函數(shù)的形參,后面的參數(shù)是值
好了,Ninject就介紹到這了,如有不對(duì),請(qǐng)多多包涵
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
ASP.NET操作Word的IIS權(quán)限設(shè)置
檢索 COM 類(lèi)工廠中 CLSID 為 {00024500-0000-0000-C000-000000000046} 的組件時(shí)失敗,原因是出現(xiàn)以下錯(cuò)誤: 80070005。2011-02-02asp.net repeater實(shí)現(xiàn)批量刪除
asp.net repeater實(shí)現(xiàn)批量刪除實(shí)現(xiàn)效果代碼2009-03-03asp.net 純真ip庫(kù)取得所在地實(shí)現(xiàn)代碼
asp.net 純真ip庫(kù)取得所在地實(shí)現(xiàn)代碼,需要的朋友可以參考一下。2009-05-05客戶端用JavaScript填充DropDownList控件 服務(wù)器端讀不到值
今天遇到一個(gè)奇怪的問(wèn)題,某一頁(yè)面需要使用三級(jí)級(jí)聯(lián)下拉列表框。為提高用戶體驗(yàn),采用jQuery的cascadingDropDown插件調(diào)用后臺(tái)Web Services來(lái)實(shí)現(xiàn)ajax填充。2010-09-09.NET數(shù)組使用中的注意事項(xiàng)小結(jié)
這篇文章主要介紹了.NET數(shù)組使用中的注意事項(xiàng),總結(jié)了常見(jiàn)的三個(gè)數(shù)組使用中的注意事項(xiàng),對(duì)于.NET初學(xué)者有一定的參考借鑒價(jià)值,需要的朋友可以參考下2014-12-12asp.net 獨(dú)立Discuz頭像編輯模塊分離打包
在Discuz產(chǎn)品系列(包括UCenter、UCHome)中有一個(gè)flash頭像上傳編輯的功能比較好用,和之前自己用js實(shí)現(xiàn)的照片在線編輯插件比較像,于是想將它獨(dú)立出來(lái),一方面可以學(xué)習(xí)研究,另一方面有機(jī)會(huì)可以在項(xiàng)目中使用(這里主要是指Asp.Net程序,php的與之類(lèi)似)。2011-06-06MultiLine 換行后實(shí)現(xiàn)讀取不換行的具體思路
輸入內(nèi)容中有換行,保存到數(shù)據(jù)庫(kù),直接查看感覺(jué)沒(méi)有換行,但查詢結(jié)果“以文本格式顯示結(jié)果”你就會(huì)發(fā)現(xiàn) 其實(shí)是有換行的,下面與大家分享下具體的解決方法2013-06-06ASP.NET?Core?MVC控制器請(qǐng)求依賴注入
這篇文章介紹了ASP.NET?Core?MVC控制器請(qǐng)求依賴注入的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04.Net?Core跨平臺(tái)應(yīng)用開(kāi)發(fā)串口篇HelloArm
這篇文章介紹了.Net?Core跨平臺(tái)應(yīng)用開(kāi)發(fā)串口篇HelloArm,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-01-01