在MVC項目中使用Ninject

項目結構圖:

      

App_start文件夾中的文件是VS自己創建的,其中NinjectWebCommon類在創建之初并不存在。后面會再次提到!

添加一個Home控制器。代碼如下:

using EssentialTools.Models;
using Ninject;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;namespace EssentialTools.Controllers
{public class HomeController : Controller{private IValueCalculator calc;Product[] products ={new Product{Name="Kayak",Category="Watersports",Price=275M},new Product{Name="LifeJacket",Category="Watersports",Price=48.95M},new Product{Name="Soccer Ball",Category="Soccer",Price=19.50M},new Product{Name="Corner Flag",Category="Soccer",Price=34.95M}};public HomeController(IValueCalculator calcParam){calc = calcParam;}public ActionResult Index(){              //IKernel ninjectKernel = new StandardKernel();//ninjectKernel.Bind<IValueCalculator>().To<LinqValueCalculator>();//LinqValueCalculator calc = new LinqValueCalculator();//return View(calc.ValueProducts(products));ShoppingCart cart = new ShoppingCart(calc) { Products = products };decimal totalValue = cart.CalculateProductTotal();return View(totalValue);}}
}
HomeController.cs

為控制器中的Index方法添加視圖。代碼如下:

@model decimal
@{ViewBag.Title = "Index";Layout = null;
}<div> Total value is $@Model</div>
Index.cshtml

創建Infrastructure文件夾,在該文件夾下創建Ninject的依賴解析器。代碼如下:

using EssentialTools.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Ninject;namespace EssentialTools.Infrastructure
{public class NinjectDependencyResolver : IDependencyResolver{private IKernel kernel;public NinjectDependencyResolver(IKernel knernelParam){kernel = knernelParam;AddBindings();}public object GetService(Type serviceType){return kernel.TryGet(serviceType);}public IEnumerable<object> GetServices(Type serviceType){return kernel.GetAll(serviceType);}private void AddBindings(){kernel.Bind<IValueCalculator>().To<LinqValueCalculator>();}}
}
NinjectDependencyResolver.cs

在Models文件夾中攢關鍵1個接口,3個類。代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;namespace EssentialTools.Models
{public interface IValueCalculator{decimal ValueProducts(IEnumerable<Product> products);}
}
IValueCalculator.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;namespace EssentialTools.Models
{public class LinqValueCalculator : IValueCalculator{public decimal ValueProducts(IEnumerable<Product> products){return products.Sum(p => p.Price);}}
}
LinqValueCalculator.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;namespace EssentialTools.Models
{public class Product{public int ProductID { get; set; }public string Name { get; set; }public string Description { get; set; }public decimal Price { get; set; }public string Category { get; set; }}
}
Product.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;namespace EssentialTools.Models
{public class ShoppingCart{IValueCalculator calc;public ShoppingCart(IValueCalculator calcParam){calc = calcParam;}public IEnumerable<Product> Products { get; set; }public decimal CalculateProductTotal(){return calc.ValueProducts(Products);}}
}
ShoppingCart.cs

使用nuget安裝Ninject

工具→庫程序包管理器→程序包管理器控制臺

安裝ninject內核包:
install-package Ninject -version 3.0.1.10
安裝ninject內核包的拓展包:
install-package Ninject.Web.Common -version 3.0.0.7
對MVC3的引用(在mvc5中仍能用到)
install-package ninject.mvc3 -version 3.0.0.6

版本號最好帶上,不帶版本號,可能會出錯!

安裝好了之后NinjectWebCommon.cs文件就會出現。這時候需要為該類中的RegisterServices方法添加代碼(注冊依賴解析器)

RegisterServices方法代碼如下:

private static void RegisterServices(IKernel kernel){System.Web.Mvc.DependencyResolver.SetResolver(new EssentialTools.Infrastructure.NinjectDependencyResolver(kernel));}
RegisterServices方法代碼

?

對瀏覽器發出請求到控制器處理請求這段時間發生的事!

1、瀏覽器向MVC框架發送一個請求Home的URL,MVC框架推測出該請求意指Home控制器,于是會創建HomeController類實例。

2、MVC框架在創建HomeController類實例過程中會發現其構造器有一個對IValueCalculator接口的依賴項,于是會要求依賴項解析器對此依賴項進行解析,?將該接口指定為依賴項解析器中的GetService方法所使用的類型參數。

3、依賴項解析器會將傳遞過來的類型參數交給TryGet方法,要求Ninject創建一個新的HomeController接口實例。

4、Ninect會檢測到HomeController構造器與其實現類LilnqValueCalculator具有綁定關系,于是為該接口創建一個LinqValueCalculator類實例,并將其回遞給依賴項解析器。

5、依賴項解析器將Ninject所返回的LilnqValueCalculator類作為IValueCalculator接口實現類實例回遞給MVC框架

6、MVC框架利用依賴項解析器返回的接口類實例創建HomeController控制器實例,并使用該控制器實例對請求進行服務。

?

為已經能夠正常運行的程序添加功能:為購物車內的東西打折。

在Models文件夾內添加一個叫做Discount的類

?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;namespace EssentialTools.Models
{public interface IDiscountHelper{decimal ApplyDiscount(decimal totalParam);}public class DefaultDiscounter : IDiscountHelper{public decimal DiscountSize { get; set; }public decimal ApplyDiscount(decimal totalParam){return (totalParam - (DiscountSize / 100m * totalParam));}}
}
Discount.cs

?

這個類里面包涵了一個接口,沒有讓接口和類進行分離(當然,這不是重點)。

?

更改后的計算價格的類LinqValueCalculator

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;namespace EssentialTools.Models
{public class LinqValueCalculator : IValueCalculator{private IDiscountHelper discounter;public LinqValueCalculator(IDiscountHelper discountParam){discounter = discountParam;}public decimal ValueProducts(IEnumerable<Product> products){return discounter.ApplyDiscount(products.Sum(p => p.Price));}}
}
LinqValueCalculator.cs

最后更改依賴項解析器類中的AddBindings方法

private void AddBindings(){kernel.Bind<IValueCalculator>().To<LinqValueCalculator>();kernel.Bind<IDiscountHelper>().To<DefaultDiscounter>().WithPropertyValue("DiscountSize", 50M);}

在Discount類中,有一個DiscountSize的屬性,上面方法中使用了WithPropertyValue方法為這個屬性賦了初始值。

?

轉載于:https://www.cnblogs.com/vichin/p/8595371.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/283855.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/283855.shtml
英文地址,請注明出處:http://en.pswp.cn/news/283855.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux IP、端口連通性測試

ssh -v -p 50001 root10.210.200.82轉載于:https://www.cnblogs.com/kuiyeit/p/6723508.html

緊急通知:360 網站衛士前端公共庫已停止服務

所有使用了360前端公共庫的開發者和站長們&#xff0c;請及時更換你的前端庫的鏈接&#xff08;主要是前端庫和谷歌 fonts&#xff09;&#xff0c;否則網站打開速度會極慢&#xff0c;甚至會在 Chrome 瀏覽器中崩潰。 360前端公共庫曾經提供的服務有&#xff1a; 前端公共庫&a…

一文學會Autofac的基礎操作:幾種實現注冊方式、3種注入方式、生命周期、AOP以及過濾器實現依賴注入...

前言&#xff1a;直接開干。使用Autofac進行服務注冊實踐&#xff1a;新建三個項目&#xff0c;分別是webapi項目 Wesky.Core.Autofac以及兩個類庫項目 Wesky.Core.Interface和Wesky.Core.Service。在Webapi項目下&#xff0c;引用Autofac的三個包&#xff1a;Autofac、Autofac…

解析互聯網廣告術語 CPM、CPC、CPA、CPS、CPL、CPR 是什么意思

1. CPM&#xff08;Cost per mille&#xff09;&#xff0c;每千次展現收費 這是一種最為常見的廣告模式&#xff0c;也是很多網站流量變現的一種途徑&#xff0c;這種廣告不管計算點擊&#xff0c;或者什么注冊下載之類的轉化&#xff0c;只要這個廣告在網站上被正常的展現給…

JavaScript數組迭代方法(圖解)

轉載于:https://www.cnblogs.com/seanna/p/6724032.html

Rider調試ASP.NET Core時報thread not gc-safe的解決方法

新建了一個ASP.NET Core 5.0的Web API項目&#xff0c;當使用斷點調試Host.CreateDefaultBuilder(args)時&#xff0c;進入該函數后查看中間變量的值&#xff0c;報錯Evaluation is not allowed: The thread is not at a GC-safe point。在群里問了也沒人回應&#xff0c;可能沒…

The SDK platform-tools version ((23)) is too old to check APIs compiled with API 26;

好像是更新過啥SDK之后&#xff0c;項目一直在包名的那一行顯示紅線&#xff0c;不過是不報編譯錯誤的&#xff0c;就是看著老扎心老扎心的&#xff0c;開始以為是指定的SDK版本的問題&#xff0c;修改后發現無效&#xff0c;最后找到方法解決&#xff1a; 打開SDK Manager ---…

oracle 各種日期函數格式和操作

2019獨角獸企業重金招聘Python工程師標準>>> ORACLE日期時間函數大全 TO_DATE格式(以時間:2007-11-02 13:45:25為例) Year: yy two digits 兩位年 顯示值:07 yyy three digits 三位年 顯示值:00…

火山引擎李玉光:字節跳動大規模K8s集群管理實踐

2022年5月31日&#xff0c;在CSDN云原生系列在線峰會第6期“K8s大規模應用和深度實踐峰會”&#xff0c;火山引擎資深云原生架構師李玉光分享了《字節跳動大規模K8s集群管理實踐》。 字節跳動云原生體系 字節跳動內部云原生技術的使用貫穿組織技術體系各層面&#xff0c;整體如…

(7)關于margin的一些想法2.0

這篇主要討論的就是margin負值與float的關系。 首先&#xff0c;例子。 <!doctype html> <html> <head> <meta charset"utf-8"> <title>無標題文檔</title> <style typetext/css> html,body{padding:0;margin:0;} div{wid…

解決ASP.NET Core在Task中使用IServiceProvider的問題

前言問題的起因是在幫同事解決遇到的一個問題&#xff0c;他的本意是在EF Core中為了解決避免多個線程使用同一個DbContext實例的問題。但是由于對Microsoft.Extensions.DependencyInjection體系的深度不是很了解&#xff0c;結果遇到了新的問題&#xff0c;當時整得我也有點蒙…

什么是SRE?一文詳解SRE運維體系

在任何有一定規模的企業內部&#xff0c;一旦推行起來整個SRE的運維模式&#xff0c;那么對于可觀測性系統的建設將變得尤為重要&#xff0c;而在整個可觀測性系統中。 可觀測性系統 在任何有一定規模的企業內部&#xff0c;一旦推行起來整個SRE的運維模式&#xff0c;那么對于…

python初探

python近兩年似乎已經很熱了&#xff0c;不了解一下怎么能行呢&#xff0c;似乎python最大的優點就是簡潔、易懂、優雅。目前豆瓣、知乎等后臺服務使用的也都是python語言。 python一般可以用于網站服務、小工具、數據分析等工作。它作為高級語言&#xff0c;和js一樣&#xff…

Linux系統PATH變量配置

alias命令用于設置命令的別名&#xff0c;格式為“alias 別名命令” 例如擔心復制文件時誤將文件被覆蓋&#xff0c;可以執行alias cp" cp -i"&#xff0c;如此一來 每次復制命令都會詢問用戶是否要覆蓋。 unalias命令用于取消命令的別名&#xff1a;格式為"una…

solr5.5索引mysql數據(新手總結)

一 solr5.5環境部署到Eclipse(luna版&#xff09; solr部署參見&#xff1a;http://blog.csdn.net/csmnjk/article/details/64121765 二 Ik分詞器設置 IK分詞器設置參見:http://blog.csdn.net/csmnjk/article/details/51693578 solr4版本的schema.xml文件對應solr5版本的manage…

老板加薪!看我做的WPF Loading!!!

老板加薪&#xff01;看我做的WPF Loading&#xff01;&#xff01;&#xff01;控件名&#xff1a;RingLoading作者&#xff1a;WPFDevelopersOrg原文鏈接&#xff1a; https://github.com/WPFDevelopersOrg/WPFDevelopers.Minimal框架使用大于等于.NET40&#xff1b;Visua…

如何避免下重復訂單

電子交易的一個很基本的問題&#xff0c;就是避免用戶下重復訂單。用戶明明想買一次&#xff0c;結果一看下了兩個單。如果沒有及時發現&#xff0c;就會帶來額外的物流成本和扯皮。對商家的信譽也不好看。 從技術上看&#xff0c;這是一個分布式一致性問題&#xff1b;但實際…

圖像分類學習筆記

1.計算機認識圖像的方式&#xff1a;都是數字。例如一個 128X128 的3通道的圖片 是由 128X128X3個數字 組成的。 2.面臨的難點&#xff1a;一幅圖可以說明。 3.分類器 A&#xff1a;Nearest Neighbor Classifier&#xff1a;與CNN無關&#xff0c;但是可以幫助我們理解一下分類…

知物由學 | 干貨!一文了解安卓APP逆向分析與保護機制

“知物由學”是網易云易盾打造的一個品牌欄目&#xff0c;詞語出自漢王充《論衡實知》。人&#xff0c;能力有高下之分&#xff0c;學習才知道事物的道理&#xff0c;而后才有智慧&#xff0c;不去求問就不會知道。“知物由學”希望通過一篇篇技術干貨、趨勢解讀、人物思考和沉…

[轉]以終為始,詳細分析高考志愿該怎么填

為什么寫這篇文章&#xff1f; 之所以寫本文&#xff0c;是因為我自己有用處。 我簡要介紹&#xff0c;長話短說。我從一個普通的211本科畢業&#xff0c;已經接受社會"毒打"多年&#xff0c;回想起高考填志愿&#xff0c;依然會覺得有些許遺憾。我在貴州省的一個小縣…