Ninject如何在ASP.NET MVC中使用?相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
Ninject是一個(gè)快如閃電的,輕量級(jí)的。。。。。依賴注入框架,呃呃呃,貌似很少用到,Ninject就是一個(gè)DI容器,作用是對(duì)ASP.NET MVC程序中的組件進(jìn)行解耦 ,說到解耦其實(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); }
通過接口可以說達(dá)到了我們想要的結(jié)果,也就是Shopping和Test之間的耦合。但是在控制器中卻沒辦法達(dá)到這個(gè)目的
public ActionResult Index(){ ITest IT=new Test(); ShoppingCart cart=new ShoppingCart(IT);{Products=products}; Decimal total=IT.result(); return View(total); }
我們只能借助Ninject來幫我們實(shí)現(xiàn)
可以通過nuget下載Ninect也可以通過Ninject下載
那么我們?cè)撛趺词褂肗inject幫我們解決上述的問題呢?
其實(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)類和接口類綁定在一起 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)迫癥吧,覺得這么一坨東西放在那里好礙眼吖,不可能叫我每一個(gè)動(dòng)作里面都寫這一坨東西吧,當(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è)方法是用來綁定實(shí)現(xiàn)類和接口
GetService方法中的TryGet類似于上面的Get,當(dāng)沒有合適的綁定時(shí),這個(gè)會(huì)返回一個(gè)null值,不會(huì)拋異常,而GetServices方法中的GetAll對(duì)單一類型的多個(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大概的用法也差不多了,下面說的時(shí)Ninject比較新穎的東西
就是指定屬性或者構(gòu)造函數(shù)傳值了,其實(shí)也沒什么,只是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è)是屬性值,這樣子可以一開始就給這個(gè)屬性賦值上默認(rèn)值,個(gè)人感覺作用倒是不大,也有其他的方法可以實(shí)現(xiàn)同樣效果
WithConstructorArgument這個(gè)也差不多,參數(shù)一是構(gòu)造函數(shù)的形參,后面的參數(shù)是值
ASP.NET 是開源,跨平臺(tái),高性能,輕量級(jí)的 Web 應(yīng)用構(gòu)建框架,常用于通過 HTML、CSS、JavaScript 以及服務(wù)器腳本來構(gòu)建網(wǎng)頁(yè)和網(wǎng)站。
看完上述內(nèi)容,你們掌握Ninject如何在ASP.NET MVC中使用的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
當(dāng)前文章:Ninject如何在ASP.NETMVC中使用-創(chuàng)新互聯(lián)
網(wǎng)頁(yè)地址:http://jinyejixie.com/article12/cspjdc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司、電子商務(wù)、全網(wǎng)營(yíng)銷推廣、網(wǎng)站策劃、外貿(mào)建站、網(wǎng)站改版
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容