首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

Castle Windsor 入門:IoC 容器核心概念與基本操作實戰

     編輯:關於.NET

什麼是 Windsor 容器?

Windsor 是 Castle 專案的核心 IoC (Inversion of Control) 容器,建構於 MicroKernel 之上。它能自動檢測類別相依性、解析建構函式參數、管理物件生命週期,並提供服務定位與攔截(AOP)等進階功能。

IoC 容器四大核心步驟

  1. 建立容器:IWindsorContainer container = new WindsorContainer();
  2. 加入組件:將服務介面與實作類別註冊,container.AddComponent("key", typeof(IService), typeof(Impl));
  3. 獲取組件:透過 key 或型別解析,ILog log = (ILog)container["key"];
  4. 使用組件:直接呼叫介面方法。

完整範例:日誌服務與格式化服務

1. 定義服務介面

public interface ILog
{
    void Write(string msgStr);
}
public interface ILogFormat
{
    string Format(string msgStr);
}

2. 實作組件

public class TextFileLog : ILog
{
    private readonly string _target;
    private readonly ILogFormat _format;
    public TextFileLog(string target, ILogFormat format)
    {
        _target = target;
        _format = format;
    }
    public void Write(string msgStr)
    {
        string str = _format.Format(msgStr) + _target;
        using (var fs = new FileStream(_target, FileMode.Append))
        using (var sw = new StreamWriter(fs, Encoding.Default))
            sw.WriteLine("Log:-->" + str);
    }
}
public class TextFormat : ILogFormat
{
    public string Format(string msgStr) => "On:" + msgStr;
}

3. XML 組態註冊 (App.config / Web.config)

<configuration>
  <configSections>
    <section name="castle" type="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler, Castle.Windsor" />
  </configSections>
  <castle>
    <components>
      <component id="txtLog" service="IOCDayOne.ILog,IOCDayOne" type="IOCDayOne.TextFileLog,IOCDayOne">
        <parameters>
          <target>C:\Log.txt</target>
        </parameters>
      </component>
      <component id="format" service="IOCDayOne.ILogFormat,IOCDayOne" type="IOCDayOne.TextFormat,IOCDayOne" />
    </components>
  </castle>
</configuration>

4. 程式碼啟動容器並解析

class Program
{
    static void Main(string[] args)
    {
        // 透過 XML 組態建立容器
        IKernel kernel;
        var source = new Castle.Core.Resource.ConfigResource();
        var interpreter = new XmlInterpreter(source);
        var windsor = new WindsorContainer(interpreter);
        kernel = windsor.Kernel;

        // 解析並使用
        ILog log = (ILog)kernel["txtLog"];
        log.Write(DateTime.Now.ToShortDateString());
    }
}

輸出:Log:-->On:2008-4-3C:\Log.txt

容器如何自動解析相依性?

TextFileLog 建構函式需要 string target 與 ILogFormat format。容器在註冊 ILog 時發現相依 ILogFormat,會自動從容器尋找已註冊的 format 組件注入。若找不到則拋出例外。

進階:完全透過組態檔驅動,程式碼零註冊

上例仍在程式碼呼叫 AddComponent。若需求變更(如換成 DatabaseLog),修改程式碼違反 OCP。解法:將所有註冊移至 App.config:

<castle>
  <components>
    <component id="txtLog" service="IOCDayOne.ILog,IOCDayOne" type="IOCDayOne.TextFileLog,IOCDayOne">
      <parameters><target>C:\Log.txt</target></parameters>
    </component>
    <component id="format" service="IOCDayOne.ILogFormat,IOCDayOne" type="IOCDayOne.TextFormat,IOCDayOne" />
  </components>
</castle>

啟動碼簡化為:

var windsor = new WindsorContainer(new XmlInterpreter(new ConfigResource()));
ILog log = (ILog)windsor.Kernel["txtLog"];
log.Write(DateTime.Now.ToShortDateString());

此時更換實作只需改組態檔,達成**依賴倒置**與**開放封閉原則**。

總結

  • Windsor 容器生命週期:建立 → 註冊(程式碼或 XML) → 解析 → 釋放。
  • 自動建構函式注入解決相依性鏈。
  • XML 組態外部化註冊,支援部署時熱插拔實作。

下一篇將示範如何在真實專案中封裝容器單例、整合到 ASP.NET WebForm / MVC 生命週期中。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved