8

我有4個項目:控制檯應用程序依賴注入和項目結構

核心(iServer的):

  • 系統
  • System.Core程序

DependencyResolver:

  • 核心
  • StructureMap

基礎設施(服務):

  • 核心
  • 外部依賴性

控制檯:

  • 核心
  • DependencyResolver

Requierements:

我想只有在DependencyResolver使用StructureMap。此外,控制檯應用程序不應該瞭解Infrastucture的任何內容。

當我不想在我的控制檯應用程序上引用StructureMap時,我必須構建一個ServiceLocator。

在DependencyResolver我有一個引導程序是負責調用StructureMap註冊表的東西(註冊)

在我的控制檯應用程序,我想獲得一個實例。爲此我需要引用StructureMap。另一種方法是在StructureMaps解析方法中編寫一個小包裝。

是否有任何其他更好的方式將控制檯從StructureMap中解耦?

+0

聽起來有點過於工程。你的代碼是什麼樣的?爲什麼你需要一個服務定位器,如果你的依賴解析器已經封裝了結構映射? – SimonC 2012-03-21 14:40:11

+0

你見過http://bootstrapper.codeplex.com/ – 2012-03-21 14:42:10

+0

名稱依賴關係解析器並不是關於組件所能負責的最佳選擇。目前唯一的責任是註冊依賴關係。所以我的問題更多的是依賴注入的解決方案。 – Rookian 2012-03-21 14:52:44

回答

17

雖然我看到分離IoC寄存器的原因,解決,從應用程序的實現中釋放,但我看不到任何理由爲什麼IoC容器不應該在控制檯應用程序(組合根)和改爲在另一個程序集中實現應用程序。

這樣的控制檯應用程序非常簡單:

  1. 創建容器
  2. 裝入容器配置
  3. 解析的應用程序
  4. 調用運行的應用程序,並通過控制檯參數一起
  5. 當應用程序退出運行方法時處置容器

隨着SM看起來大約是這樣的:

public void Main(params string[] args) 
{ 
    using (var container = new Container()) 
    { 
     container.LoadAllConfigurationModules(); 
     container.AddRegistry<SomeRegistry>(); 
     container.GetInstance<Application>().Run(args); 
    } 
} 

因爲你不能在啓動時創建的東西,你在你的應用程序建立組裝工廠接口:

interface ISomeFactory { ISomeDependency CreateSomeDependency() } 

,並實現在這個界面控制檯應用程序通過注入容器並使用它來解析實例。我猜SM實現看起來像這樣:

public class SomeFactory : ISomeFactory 
{ 
    public SomeFactory(IContainer sontainer) { this.container = container; } 
    ISomeDependency CreateSomeDependency() { this.container.GetInstance<ISomeDependency>(); } 
} 

其他IoC容器甚至具有自動實現這些接口工廠的功能。

+0

使用您的解決方案,您必須引用控制檯應用程序中的所有庫。因爲組合根直接位於Main類中。 – Rookian 2012-03-25 13:47:59

+6

是的,這是正確的。但問題在哪裏?這個程序集有一個目的 - 引導! – 2012-03-26 00:34:28

+0

啊好的。你的第二個陳述很重要。這就說得通了。 – Rookian 2012-03-26 08:27:54