1

我正在使用StructureMap在我的ASP.NET MVC項目中執行DI。我把我的圖書館分成以下三部分。使用StuctureMap掃描未引用的程序集

  1. 核心
  2. 服務
  3. 數據(包含庫)

核心只包含所有的接口和服務,數據包含其執行情況。

現在,當我在網站中設置StructureMap時,我需要告訴它掃描服務和數據程序集,因爲它們包含核心接口的實現,但這意味着我將不得不在Web項目中引用它們,儘管它僅取決於服務項目,然後取決於數據項目。

要我引用在Web項目這兩個DLL,因爲它敗壞抽象的利益沒有意義?

可有人請向我解釋,如果我需要引用這些組件或不是,然後是什麼首先使用獨立的接口的優勢在哪裏?

+1

的可能重複[IOC/DI - ?爲什麼我必須引用所有層/組件的入境申請(http://stackoverflow.com/questions/9501604/ioc-di-why-do-i-have -to-reference-all-layers-assemblies-in-entry-application) – Steven

回答

2

Web項目是應用程序的composition root。組合根是構成應用程序的對象圖的應用程序中的一個單獨位置。您不必從組合根中引用程序集,可以使用約定掃描程序集,但通常不值得費力IMO。

通過使組合物根引用你變平的依賴性的層次結構允許更鬆散的耦合的依賴關係;見Mark Seeman的優秀解釋here

除以你的應用分成不同的項目(組件)允許您重用在不同的應用,也間的組件的功能,按需加載該應用程序的部分(用在建築的插頭)。 Don't overdo it。想想爲什麼你把解決方案分開。即使您將解決方案拆分爲多個項目以防止「錯誤的方向」引用,其他程序員也可能違反您的預期架構。

你在問使用單獨界面的要點是什麼。接口提供了一種在代碼中抽象的方法,以允許鬆耦合和可組合性。通過programming towards the interface而不是具體實現,您可以輕鬆更改實現而不更改相關代碼。這使您可以更輕鬆地更改和調整應用程序。

+0

感謝您的回答。這在我的腦海中清除了許多混亂,但是我最終得出的結論與你自己突出顯示的相同。即使我將解決方案分成多個項目以防止「錯誤的方向」引用,其他程序員也可能違反我的預期架構。那麼你如何解決這個問題呢?我應該將所有DLL複製到bin文件夾並使用組件掃描而不是引用它們嗎?這是推薦的方法嗎? –

+0

無論您嘗試多麼努力,其他程序員都會想辦法破壞架構。我認爲這是一個教育和溝通的問題,而不是試圖從技術上解決問題。我的想法是:採用最簡單的方法,花時間讓架構變得明顯,而不是讓事情變得複雜。 – PHeiberg

+0

我同意你的想法,標記爲答案謝謝! :) –