2011-06-27 125 views
2

我試圖在我的ASP.Net MVC 3應用程序中實現StructureMap。我的架構遵循n層方法,其中我的UI層與我的服務層進行對話,而我的服務層又與我的業務層談話,然後與存儲庫層進行對話。我有數據合同代表流經所有層的數據。StructureMap n層應用程序

我的UI層應該只知道服務層。我的UI不應該知道或關心業務,更不用說存儲庫或數據層。每一層是它自己的程序集,我使用構造函數依賴注入來注入必要的實例(即,我將業務對象注入到我的服務構造函數中,並將存儲庫對象注入到業務構造函數中)。因此,如果我的層位於單獨的程序集中,並且結構圖所在的UI組件不知道下層,那麼如何配置結構圖?我不願意在我的UI層中創建所有位於服務層後面的「較低」層的引用。如果我這樣做,那麼這可能會爲UI直接與數據庫進行交談打開大門,這是不好的。

請幫忙。

感謝

湯姆

+0

你試過了嗎?我相信它會掃描整個應用程序域,其中應包括所有程序集。我可能是錯的,雖然;) –

+0

@RexM你沒有錯。如果可以找到它們,StructureMap確實可以連接所有組件。 –

回答

2

在那裏做過。直接就像你一樣的想法,認爲避免彙編引用將解決一切。我甚至成功地做了你正在試圖用後構建xcopy'ing構建的DLL。事實上 - 這只是讓它變得比它應該的更混亂。

事情是 - 引用本身並不是邪惡根源。 It's fine以引用來自最上面的(UI)程序集的所有內容。不好的代碼是造成麻煩的原因。

2

我不願意建立在我的UI層對這些坐在服務層後面的所有「低」層次的引用。如果我這樣做,那麼這可能會爲UI直接與數據庫進行交談打開大門,這是不好的。

你應該引用所有層到最終ASP.NET應用程序,它是在DI容器被配置在哪裏。部署時,所有程序集都必須位於bin文件夾中,否則您的應用程序將無法工作。

UI層(ASP.NET應用程序)不直接與數據庫交談。如果你正確地抽象了你的服務,那麼它就會與服務抽象進行對話,這個服務抽象根據存儲庫抽象進行協商,這取決於你如何配置你的DI對話到數據存儲。

2

對於結構圖來連接鏈中的依賴關係,它將需要訪問您實際要使用的所有程序集。

這並不意味着用戶界面必須引用那些雖然(儘管這可能是最簡單的解決方案)

你可以讓你只包含它所需要的接口,在不知道任何UI組件參考這些intferaces的實現(或他們有什麼依賴關係)

這意味着你的UI應該只知道你的服務層接口。

要不是你應用能夠使用所有的各個部分共同它必須知道要使用的服務實現的,必須知道哪些實現,它的實現需要使用任何依賴關係,等等一路下線。這應該全部在一個地方完成(global.ashx在我認爲的ASP MVC應用程序中),並且這是對容器或其他實現類的任何引用都應該存在的唯一位置。

應用程序是所有層級的組合。這不僅僅是你的用戶界面。

如果你不想引用那些程序集,那麼你可以通過xml來配置結構圖,這可能會動態加載程序集。我對此不確定,但我認爲它應該起作用。但Xml配置更麻煩。

只要你的服務接口注入你的UI控制器,那麼你應該是相當安全的。對於某些人使用像db層這樣的引用dll中的一個新的依賴關係,他們必須將該接口引入控制器並將其與結構圖連接起來,這應該很容易被發現。