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

實戰分層架構(六):依賴注入機制與 IoC 容器自製——反射、快取與 Abstract Factory 的融合實踐

     編輯:關於.NET

為何需要依賴注入?

分層架構核心原則:**上層不依賴下層具體實現,而依賴抽象介面**。若 BLL 直接 new SqlDAL(),更換資料庫即須修改 BLL 程式碼並重新編譯,違反開放封閉原則。DI 容器讓具體型別在組態檔宣告,執行期動態解析,實現「可替換式」架構與並行開發。

理論基石:Abstract Factory + 反射機制

傳統 Abstract Factory 需為每種 DAL 實作寫一個 Factory 類別(如 SqlDALFactory、AccessDALFactory),類別爆炸。.NET 反射機制允許單一 Factory 透過組件名稱動態載入型別,大幅簡化結構。

Abstract Factory 在 DAL 的應用示意圖

組態配置:Web.config 宣告實作組件

<appSettings>
  <add key="DAL" value="" />  <!-- 如:NGuestBook.AccessDAL -->
  <add key="BLL" value="" />  <!-- 如:NGuestBook.SimpleBLL -->
</appSettings>

快取輔助類:CacheAccess

封裝 HttpRuntime.Cache,支援檔案相依性(Web.config 變更自動失效):

public sealed class CacheAccess
{
    public static void SaveToCache(string key, object obj, CacheDependency dep)
        => HttpRuntime.Cache.Insert(key, obj, dep);
    public static object GetFromCache(string key)
        => HttpRuntime.Cache[key];
}

核心 DI 容器:DependencyInjector

雙方法分別解析 DAL/BLL,邏輯對稱:

public sealed class DependencyInjector
{
    public static object GetDALObject(string className)
    {
        // 1. 取得 DAL 組件名稱 (快取優先)
        object dal = CacheAccess.GetFromCache("DAL");
        if (dal == null) {
            var dep = new CacheDependency(HttpContext.Current.Server.MapPath("Web.Config"));
            dal = ConfigurationManager.AppSettings["DAL"];
            CacheAccess.SaveToCache("DAL", dal, dep);
        }
        string dalName = (string)dal;
        
        // 2. 取得具體型別實例 (快取優先)
        object obj = CacheAccess.GetFromCache(className);
        if (obj == null) {
            var dep = new CacheDependency(HttpContext.Current.Server.MapPath("Web.Config"));
            obj = Assembly.Load(dalName).CreateInstance(dalName + "." + className);
            CacheAccess.SaveToCache(className, obj, dep);
        }
        return obj;
    }
    public static object GetBLLObject(string className) { /* 同理,鍵改為 "BLL" */ }
}

關鍵設計:雙層快取(組件名稱 + 實例),Web.config 為相依性觸發熱更新,Assembly.Load 載入組件,CreateInstance 建立具體型別。

門面 Factory:對外統一入口

DALFactory、BLLFactory 封裝介面轉型,呼叫端零耦合:

public sealed class DALFactory
{
    public static IAdminDAL CreateAdminDAL() => (IAdminDAL)DependencyInjector.GetDALObject("AdminDAL");
    public static IMessageDAL CreateMessageDAL() => (IMessageDAL)DependencyInjector.GetDALObject("MessageDAL");
    public static ICommentDAL CreateCommentDAL() => (ICommentDAL)DependencyInjector.GetDALObject("CommentDAL");
}
public sealed class BLLFactory { /* 同理 */ }

使用範例:BLL 中取得 DAL

public class AdminBLL : IAdminBLL
{
    private readonly IAdminDAL dal = DALFactory.CreateAdminDAL(); // 唯一依賴抽象
    public AdminInfo Login(string name, string pwd) => dal.GetByNameAndPassword(name, pwd);
    // ...
}

架構優勢總結

  • 零侵入式切換:修改 Web.config 兩行組件名稱,全系統 DAL/BLL 實作無縫切換。
  • 高效能:雙層快存機制,首次反射後後續直接取快取,效能損耗可忽略。
  • 熱更新支援:Web.config 變更觸發快取失效,無需重啟 IIS 即可生效(ASP.NET 自動重啟應用程式域除外)。
  • 並行開發:介面定義完成即可分工,DAL/BLL/UI 三方同步開發。
  • 單一職責:DependencyInjector 專責解析,Factory 專責型別轉換與對外介面。

這是一個輕量級、生產可用的 IoC 容器雛形,展現了 .NET 反射與快取機制結合的實戰價值。

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