初次嘗試使用Castle Windsor實現依賴注入DI,或者叫做控制反轉IOC。
參考:
https://github.com/castleproject/Windsor/blob/master/docs/README.md
http://terrylee.cnblogs.com/archive/2006/04/17/377018.html
依賴注入就是基於接口interface編程,而不是具體的類,實現松耦合,易於單元測試,將接口定義為服務,具體實現某一服務的類為組件。
Windsor有一個基礎的用例。
一個類庫工程中有兩個接口IDependency1、IDependency2:
namespace ClassLibrary1 { public interface IDependency1 { object SomeObject { get; set; } } public interface IDependency2 { object SomeOtherObject { get; set; } } }
實現它們的類:
namespace ClassLibrary1 { public class Dependency1 : IDependency1 { public object SomeObject { get; set; } } public class Dependency2 : IDependency2 { public object SomeOtherObject { get; set; } } }
創建Main類,作為這個庫的入口類:
namespace ClassLibrary1 { public class Main { private IDependency1 object1; private IDependency2 object2; public Main(IDependency1 dependency1, IDependency2 dependency2) { object1 = dependency1; object2 = dependency2; } public void DoSomething() { object1.SomeObject = "Hello World"; object2.SomeOtherObject = "Hello Mars"; } } }
接下來是如何使用上面創建的類庫,以一個winform項目為例,通過NuGet安裝Castle.Core、Castle.Windsor,在winform中通過一個按鈕事件注冊接口:
using Castle.MicroKernel.Registration; using Castle.Windsor; private void button1_Click(object sender, EventArgs e) { // CREATE A WINDSOR CONTAINER OBJECT AND REGISTER THE INTERFACES, AND THEIR CONCRETE IMPLEMENTATIONS. var container = new WindsorContainer(); container.Register(Component.For<Main>()); container.Register(Component.For<IDependency1>().ImplementedBy<Dependency1>()); container.Register(Component.For<IDependency2>().ImplementedBy<Dependency2>()); // CREATE THE MAIN OBJECT AND INVOKE ITS METHOD(S) AS DESIRED. var mainThing = container.Resolve<Main>(); mainThing.DoSomething();
container.Dispose();
}
以上是全部用例。簡單說一共三步:
- Register,創建容器,注冊服務和組件;
- Resolve,獲取相應組件;
- Release,在程序結束時釋放資源。
三種依賴注入方式,構造器注入,通過構造函數來提供:
public class Main { private IDependency1 object1; private IDependency2 object2; public Main(IDependency1 dependency1, IDependency2 dependency2) { object1 = dependency1; object2 = dependency2; }
}
屬性注入,依賴可有可無的時候很有用,暴露一個可寫的屬性,允許客戶提供不同的依賴實現:
public class Main { public IDependency1 object1{ get; set; } public IDependency2 object2{ get; set; } }
在使用這個類時,為object1、object2賦值為具體實現接口的類。
方法注入,當依賴對於每個方法調用都不同的時候,可以通過一個方法參數來實現,提供不同的類對象作為參數,就可以有不同的調用效果。
關鍵字:.NET,DI,Castle Windsor
