ASP.NET MVC使用Ninject的方法教程
為什么要使用Ninject?
很多其它類型的IOC容器過于依賴配置文件,老是配置,總感覺有點(diǎn)不爽,而且要使用assembly-qualified名稱(也就是類型的全名)來進(jìn)行定義,稍不注意就會因為打錯字而令整個程序崩掉。Ninject是一個快如閃電、超輕量級的基于.Net平臺的IOC容器,主要用來解決程序中模塊的耦合問題,它的目的在于做到最少配置。因此如果你不喜歡配置,不喜歡重量級IOC框架,那么就用小蘋果Ninject吧!
Ninject是一個快如閃電的,輕量級的。。。。。依賴注入框架,呃呃呃,貌似很少用到,Ninject就是一個DI容器,作用是對ASP.NET MVC程序中的組件進(jìn)行解耦 ,說到解耦其實也有其他的方式可以達(dá)到解耦這個目的,比如接口
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á)到這個目的
public ActionResult Index(){
ITest IT=new Test();
ShoppingCart cart=new ShoppingCart(IT);{Products=products};
Decimal total=IT.result();
return View(total);
}
我們只能借助Ninject來幫我們實現(xiàn)
可以通過nuget下載Ninect也可以通過Ninject下載
那么我們該怎么使用Ninject幫我們解決上述的問題呢?
其實使用Ninect不難,一共三個步驟:
//在控制器
public ActionResult Index()
{
1:創(chuàng)建一個Ninject的內(nèi)核
IKernel ninject=new StandardKernel();
2:就是配置Ninject內(nèi)核,其實就是將實現(xiàn)類和接口類綁定在一起
ninject.Bind<ITest>().To<Test>();
3:最后一步就是使用Ninject創(chuàng)建一個對象了
ITest IT=ninject.Get<ITest>();
}
從創(chuàng)建內(nèi)核到創(chuàng)建對象跟Spring.Net倒是很相似。
可能有點(diǎn)點(diǎn)強(qiáng)迫癥吧,覺得這么一坨東西放在那里好礙眼吖,不可能叫我每一個動作里面都寫這一坨東西吧,當(dāng)然不是。
下面就創(chuàng)建一個依賴項解析器(好像很高大上一樣,其實就是將上面的代碼做個封裝而已)
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這個是System.Mvc里面的繼承這個接口必須實現(xiàn)GetServices和GetService,AddBinding這個方法是用來綁定實現(xiàn)類和接口
GetService方法中的TryGet類似于上面的Get,當(dāng)沒有合適的綁定時,這個會返回一個null值,不會拋異常,而GetServices方法中的GetAll對單一類型的多個綁定時,可以用到這個
最后一步就是在App_Start這一個文件夾中找到NinjectWebCommon.cs這個文件再找到 RegisterServices(IKernel kernel)這個方法添加System.Web.Mvc.DependencyResolver.SetResolver(newNinjectResolver(kernel));
這時候我們修改下控制器中的代碼
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大概的用法也差不多了,下面說的時Ninject比較新穎的東西
就是指定屬性或者構(gòu)造函數(shù)傳值了,其實也沒什么,只是WithConstructorArgument和WithPropertyValue這兩個的使用
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這個有兩個參數(shù)一個是屬性名,一個是屬性值,這樣子可以一開始就給這個屬性賦值上默認(rèn)值,個人感覺作用倒是不大,也有其他的方法可以實現(xiàn)同樣效果
WithConstructorArgument這個也差不多,參數(shù)一是構(gòu)造函數(shù)的形參,后面的參數(shù)是值
好了,Ninject就介紹到這了,如有不對,請多多包涵
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
asp.net 動態(tài)表單之?dāng)?shù)據(jù)分頁
我們很常會在項目中提到一個動態(tài)表單的概念,比如學(xué)校里面學(xué)生的考試成績,當(dāng)學(xué)生登錄系統(tǒng)的時候,他當(dāng)然是希望看到他自己所有科目的成績;又或者是班主任,他需要看到本班同學(xué)所有科目的成績;這些時候我們一般都會在頁面中呈現(xiàn)如下的效果。2010-03-03
JQuery為用戶控件(ASCX)賦值與接口的應(yīng)用
在網(wǎng)頁動態(tài)加載用戶控件,并使用JQuery為來把網(wǎng)頁處理的值傳給用戶控件,此文利用了接口方面的知識,感興趣的各位可以參考下哈2013-03-03
asp.net CheckBoxList各項最小寬度CSS樣式(兼容性good)
ASP.NET中,CheckBoxList里的選擇都是自動寬度的,屬性時沒有設(shè)置各項寬度的設(shè)置,在IE10、遨游4極速模式及兼容模式下均可正確顯示最小寬度,此樣式除了用于CheckBoxList外,也可用于DIV等2013-04-04
ASP.NET MVC5網(wǎng)站開發(fā)管理列表、回復(fù)及刪除(十三)
這篇文章主要介紹了ASP.NET MVC5網(wǎng)站開發(fā)實現(xiàn)管理列表、回復(fù)及刪除,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2015-09-09
關(guān)于中g(shù)ridview 字符串截取的方法
在Gridview中,如果你的某一列字符串的長度過長,不做處理的話.那么將顯示的奇丑無比,可以采取設(shè)置樣式,將其顯示為定長,可以在點(diǎn)擊查看的時候,在另一個頁面對其進(jìn)行顯示2013-06-06
Net?core中使用System.Drawing對上傳的圖片流進(jìn)行壓縮(示例代碼)
這篇文章主要介紹了Net?core中使用System.Drawing對上傳的圖片流進(jìn)行壓縮,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-08-08
asp.net利用反射實現(xiàn)給model類賦值的方法
這篇文章主要介紹了asp.net利用反射實現(xiàn)給model類賦值的方法,結(jié)合實例形式分析了asp.net使用反射給model類賦值的操作步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-03-03

