[Castle Windsor]學習依賴注入


初次嘗試使用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();
}

以上是全部用例。簡單說一共三步:

  1. Register,創建容器,注冊服務和組件;
  2. Resolve,獲取相應組件;
  3. 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM