Ninject的使用


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容器的一個很好地鍛鍊工具。

發佈了102 篇原創文章 · 獲贊 15 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章