那些最好的程式能夠容納不斷變化的需求,當然,要求程式滿足所有需求卻難如登天。這就是該依賴注入發揮作用的時候了.依賴注入的最終目的是達到松耦合,而松耦合可以讓程式在不重新編譯的情況下通過配置程式來改變程式的某些部分。下面通過一個Demo來展現Ninject
我們建立一個汽車模拟器程式,所有的汽車都需要燃料,而燃料的種類卻多種多樣,我們需要告訴這個模拟器使用何種燃料,讓我們來做第一次嘗試:
// Unleaded.cs
public class Unleaded {
public void Burn() {
Console.WriteLine("Unleaded fuel burning");
}
// Diesel.cs
public class Diesel {
public void Burn() {
Console.WriteLine("Diesel fuel burning");
// Car.cs
public class Car {
private Diesel fuel { get; set; }
public Car() {
fuel = new Diesel();
}
public void Start() {
Console.WriteLine("Starting car");
fuel.Burn();
// Driver.cs
public class Driver {
public Driver() {
var car = new Car();
car.Start();
}
這滿足了最開始的要求,但是如果我們需要使用其它品種的燃料呢?我們不得不為此改變Car對象裡的代碼,這種做法是緊耦合的。是以,可是使用更好的方式,因為每一種燃料都是通過燃燒來産生熱量,是以可以将其重構為接口:
// IFuel.cs
public interface IFuel {
void Burn();
接下來,所有的燃料類型都繼承IFuel接口
public class Unleaded : IFuel { ... }
public class Diesel : IFuel { ... }
是以,可以将Car的燃料屬性改為IFuel
private IFuel fuel { get; set; }
通過這種方式依然有問題,因為車仍然需要在指定使用何種燃料,這種方式在ASP.NET MVC 2 Part – Creating Data Repositories裡我進行了簡短的讨論,稱之為構造器注入,因為指定使用何種屬性是通過構造器來完成的。
我們通過将Car的構造器進行改變,接受IFuel類型的參數并指派給燃料屬性來完成:
public Car(IFuel _fuel) {
fuel = _fuel;
這是我們就需要在Driver初始化類中初始化Car執行個體來指定相應對象
public Driver() {
var car = new Car(new Diesel());
car.Start();
雖然我們通過這種方式貌似降低了耦合,但是Driver對象仍然需要在代碼中知道使用何種燃料。而我們希望達到的效果是在程式外部來指定。
使用Ninject,Ninject是.net依賴注入庫中的一種,首先通過引用Ninject.Core.dll來進行引入,并在Car.cs中using Ninject.Core.
任何我們想實作依賴注入的地方我們都的賦予[Inject]标簽,在此,對燃料加上這個标簽:
[Inject]
下面一步是進行配置這部重頭戲,配置資訊會被包含在Ninject.Core.StartardModule的派生類當中,在此我們通過繼承這個類并重寫Load方法來實作依賴資訊的設定:
using Ninject.Core;
...
public class FuelModule : StandardModule {
public override void Load() {
Bind<IFuel>().To<Diesel>();
}
Load方法中使用了Ninject的fluent接口中的方法來告訴程式中IFuel接口的類型是柴油(Diesel)
接下來我們還需要建立Ninject管理的一個類型,在這裡我們使用”Kernel”,這個類型的構造函數接受一個包含注入資訊的Module(一般是從從StandardModule派生而來),在這裡是FuelModule,然後我們”kernel”會給予我們相應的類型:
public Driver4() {
var kernel = new StandardKernel(new FuelModule());
var car = kernel.Get<Car>();
在此,當需要改變燃料時,僅需要改變FuelModule就可以.
上面的方法還可以用于改變資料庫倉儲的類型,比如在測試的時候我們可以換掉資料庫而通過連接配接一個虛拟的資料進而使測試更加輕松愉快:-)
本文轉自CareySon部落格園部落格,原文連結:http://www.cnblogs.com/CareySon/archive/2009/12/13/1623112.html如需轉載請自行聯系原作者