1、是什麼
Ninject是一個快如閃電、超輕量級的基於.Net平臺的依賴注入框架。它能夠幫助你把應用程序分離成一個個鬆耦合、高內聚的模塊,然後用一種靈活的方式組裝起來。通過使用Ninject配套你的軟件架構,那麼代碼將會變得更加容易編寫、重用性強、易於測試和修改。
2.爲什麼要用Ninject?Ninject是一個IOC容器,用來解決程序中組件的耦合問題,它的目的在於做到最少配置。其他的的IOC工具過於依賴配置文件,需要使用assembly-qualified名稱來進行定義,庸長且複雜常常因爲打錯字而破壞程序。這些是他的優點,也是爲什麼要選擇它。
雖然配置注入看上去更容易擴展應對外部變化,但是項目龐大臃腫之後,配置文件並不好管理。固然有一些可視化的工具,但是仍然容易出現偏差。Ninject最擅長的基本注入功能就是無配置簡單快速注入,達到free yourself from xml的目的,對於一般的中小型應用程序完全可以零配置。
缺點:Ninject不能進行熱插拔。
3.怎麼用?
說了很多,接下來跟大家分享一下Ninject具體怎麼用。來看下面的一個簡單的Demo:
說明:實例主要通過計算兩個商品價格之和來進行講解。
首先定義一個接口和一個接口的實現類:
<span style="font-size:24px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Data
{
public interface IValueCalculater
{
decimal ValueProducts( Product[] products);
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Data
{
public class LinqValueCalculator:IValueCalculater
{
public decimal ValueProducts(params Product[] products)
{
return products.Sum(p => p.Price);
}
}
}</span>
接下來編寫一個Ninject配置類:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Ninject;
namespace Data
{
public class DataResolver
{
private static DataResolver _Instance;
public static DataResolver Instance
{
get
{
if (_Instance == null)
{
_Instance = new DataResolver();
}
return _Instance;
}
}
IKernel ninjectKernel;
private DataResolver()
{
ninjectKernel = new StandardKernel();
//將接口和實現類綁定
ninjectKernel.Bind<IValueCalculater>().To<LinqValueCalculator>());
ninjectKernel.Bind<IValueCalculater>().To<LinqValueCalculator>());
}
public T Resolve<T>() where T : class
{
return ninjectKernel.Get<T>();
}
}
前臺調用實現方法:
<span style="font-size:24px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Data;
namespace NinjectDemo
{
/// <summary>
/// MainWindow.xaml 的交互邏輯
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void button1_Click(object sender, RoutedEventArgs e)
{
Product[] ps ;
//實體集合
ps = new[]{
new Product(){Name="iphone" , Price=6525M},
new Product(){Name="newbalance" , Price=800M},
};
//注入接口
IValueCalculater ival= DataResolver.Instance.Resolve<IValueCalculater>();</span>
<span style="font-size:24px;">
//調用具體實現方法
decimal d = ival.ValueProducts(ps);
label1.Content = d;
}
}
}</span>
總結:Ninject是一個在中小型應用中常用的IOC容器,Ninject的應用並非這麼簡單,以上僅僅是一個最基本的使用方法了。除此之外,還可以應用在多數據庫的系統中,通過它我們可以輕鬆的實現數據庫的切換。另外對於新手來說,Ninject也是可以用來學習IOC容器的一個很好地鍛鍊工具。