DI Anti Patterns - Control Freak
前言 現在很多系統在撰寫時都會使用到一些常見 DI Container 尤其在使用一些編譯式語言(ex. .Net, Java)時(Autofac for .Net, Unity for .Net, guice for Java, di-ninja for NodeJS 等族繁不及備載…)。不過系統即使用上這些 container 只要使用方式不正確,還是可以寫出強耦合性的程式,因此這邊要來介紹一些常見的 Anti-patterns,避免自己寫出高耦合性的程式。 這一篇基本上是 Dependency Injection in .Net 這本書第二版在第五章的心得 (第二版叫 Dependency Injection Principles, Practices, and Patterns)。雖然他連簡體中文的翻譯都還沒有出來,不過還是相當推薦買來看看。 常見類型 Anti-pattern Description Control Freak 依賴反轉(Inversion of Control)的對立面,直接控制實體 Service Locator 使用一個內隱服務提供依賴給呼叫端 Ambient Context 使用靜態存取子,提供單一的依賴 Constrained Construction 讓建構子有一個特定的方法簽章 Control Freak 定義 就是直接了當的把你需要的實體給產生出來,這個與依賴反轉的原則剛好相違背。 案例 標準案例 1 2 3 4 5 6 7 8 9 public string GetContent(string fileName) { // 這個直接把要使用的實體寫在呼叫時 var saveService = new FileSaveService(); var fileContent = saveService.Read($"{fileName}.txt"); return fileContent; } 基本上這個寫法比較容易出現在所謂的 legacy code 裡,近年來 program to an interface 的意識抬頭,工程師應該都不會這樣寫了。 ...