var dependency = new DependencyObject { Value = "Dependency" };
var logicObj = new LogicObject(dependency); // 顯式構造依賴鏈
Assert.AreSame(logicObj.Dependency, dependency);
IUnityContainer container = new UnityContainer();
container.RegisterInstance(dependency); // 註冊具體實例
container.RegisterType(); // 註冊類型映射 (預設單例)
var logicObj = container.Resolve(); // 容器自動解析注入
Assert.AreSame(logicObj.Dependency, dependency);
using System;
using Microsoft.Practices.Unity;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace MyTest {
[TestClass]
public class UnitTest1 {
IUnityContainer mContainer;
[TestInitialize]
public void MyTestInitialize() {
mContainer = new UnityContainer();
}
class DependencyObject {
public string Value { get; set; }
}
class LogicObject {
private readonly DependencyObject _dependency;
public LogicObject(DependencyObject dependency) { // 建構函式注入
_dependency = dependency;
}
public DependencyObject Dependency => _dependency;
}
[TestMethod]
public void TestNormal() { /* 手動組裝 */ }
[TestMethod]
public void TestUnityContainer() { /* 容器自動組裝 */ }
}
}
LogicObject 建構函式需 DependencyObjectDependencyObject 註冊 → 找到 RegisterInstance 登記的實例new LogicObject(dependency)LogicObjectLogicObject 不知 DependencyObject 如何建構、從何而來「手動代碼裡依賴關係一目瞭然,Unity 註冊後依賴關係變得隱晦,難以從消費者代碼直接看出。」
回應策略:
UnityConfig.RegisterTypes()) 作為架構藍圖container.RegisterTypes(...) 掃描組件自動註冊,減少樣板代碼Unity 建構於 **ObjectBuilder 2** 之上,提供:建構策略鏈、生命週期管理器、建構計畫緩存、攔截器整合 (AOP)。理解 ObjectBuilder 有助於診斷循環依賴、建構失敗等疑難雜症。
建構函式注入是 DI 最純粹、最安全的形式。Unity 作為輕量級容器,配合 RegisterInstance/RegisterType/Resolve 三步曲,能優雅解決複雜物件圖組裝問題。關鍵在於:**將註冊代碼視為架構文件,建構函式視為契約,容器視為基礎設施**——而非魔法黑盒。