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

Unity 1.0 官方文檔核心精華:輕量級 DI 容器的能力邊界與最佳實踐

     編輯:關於.NET

Unity 定位:輕量、可擴展、三注入全支持

Unity Application Block 是微軟 Patterns & Practices 團隊產出的依賴注入容器,核心優勢:

  • 簡化對象創建(尤其層級依賴圖)
  • 支持運行時/配置文件指定依賴,管理橫切關注點
  • 延遲配置裝配提升靈活性
  • 服務定位器模式支撐 ASP.NET Session/Application 級容器緩存

四大核心使用場景

  1. 創建容器實例
  2. 按類型解析對象
  3. 按類型+名稱解析對象
  4. 解析特定類型所有命名實例
  5. 對現有實例執行 BuildUp 注入
  6. 三種注入標記:構造函數/屬性/方法調用

註冊 API 雙軌制

RegisterType:類型映射,容器負責構造

// 接口映射
container.RegisterType<IMyService, CustomerService>();
// 基類映射
container.RegisterType<BasePlayer, Mp3Player>();
// 命名映射
container.RegisterType<IPlayer, Mp3Player>("MyMp3");
// 指定生命周期
container.RegisterType<IPlayer, Mp3Player>(new ContainerControlledLifetimeManager());

豐富重載支持:泛型/非泛型、命名/默認、生命周期/無。

RegisterInstance:實例映射,外部控制構造

var existing = new LoggingService();
container.RegisterInstance<IMyService>(existing); // 默認單例
container.RegisterInstance<IMyService>("Named", existing, new ExternallyControlledLifetimeManager());

三大注入模式官方範例

1. 構造函數注入——最推薦方式

public class CustomerService {
    public CustomerService(LoggingService logger) {
        logger.WriteToLog("Initialized");
    }
}
// 容器自動解析 LoggingService 並注入
var svc = container.Resolve<CustomerService>();

2. 屬性(Setter)注入——[Dependency] 標記

public class ProductService {
    private SupplierData _supplier;
    [Dependency]
    public SupplierData SupplierDetails {
        get => _supplier;
        set => _supplier = value;
    }
}
// Resolve 時自動注入 SupplierData 實例

3. 方法調用注入——[InjectionMethod] 標記

public class Mp3Player : IPlayer {
    public Song CurrentSong { get; private set; }
    [InjectionMethod]
    public void Initialize(Song song) => CurrentSong = song;
    // ...
}

Unity 架構亮點與擴展點

特性說明
對象組合引擎RegisterType/RegisterInstance + Resolve/ResolveAll 核心 API
IoC 核心構造函數/屬性/方法注入,Attribute 或配置驅動
容器層級父子容器繼承,解析向上委托
配置系統標準 .NET config(XML)驅動註冊
零侵入選項無需 Attribute 即可使用構造函數注入
擴展點自定義 LifetimeManager、建構策略、攔截器

決策矩陣:何時使用 / 不使用 Unity

✅ 適用場景

  • 對象間存在依賴關係
  • 依賴複雜或需抽象(多實現切換、測試雙對象)
  • 需利用三種注入方式靈活組合
  • 需管理對象生命周期(單例、請求級、自定義作用域)
  • 運行時動態變更依賴綁定
  • ASP.NET 跨回發緩存容器/依賴

❌ 不適用場景

  • 對象無外部依賴(純值對象、工具類)
  • 依賴極簡單且固定(直接 new 更清晰)
  • 性能極度敏感且對象圖極大(容器解析有微小開銷)

文檔導航與學習路徑

  1. 開發指南:系統需求、配置、屬性、代碼集成
  2. 關鍵場景:常見操作演示
  3. 設計考慮:架構決策、擴展點設計
  4. 擴展與修改:源碼層面定制
  5. 部署運維:程序集更新、性能度量
  6. 快速入門:MVC 簡易實現、Event Broker 擴展示例

Unity 1.0 確立了微軟官方 DI 容器標準,後續版本持續增強攔截、配置、性能,核心哲學不變。

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