2011-01-23 43 views
1

我有具有三層 1.數據訪問層(類庫) 2.業務層(類庫) 3.網層(asp.net MVC項目)structureMap在多層應用程序

一個asp.net MVC應用程序

,也有一個域項目(類庫POCO)

我做我的MVC項目的Application_Start的structureMap映射,但在dataAccesslayer該類型的地圖(對於如。personRepository與IPersonReository)我需要DAL在我的web層的參考,我不認爲是正確的。

你有什麼建議 感謝

回答

2

作爲一個務實的態度,你在做什麼可能是好的如果您可以保留該規則並且從不使用Web層的DAL。然而,一旦參考文獻出現,這可能出乎意料地難以實現 - 那麼項目中的其他開發人員又該如何呢?

更好的選擇是,以分裂網層爲兩層

  1. 應用自舉層。這是真正的Web項目,但除了引導容器和實現Views(.aspx頁面)之外,應該沒有別的。這就是我們所說的Humble Executable。它將包含對所有其他項目的引用(通過DI容器),但否則它不會執行任何操作。我們稱之爲Register Resolve Release pattern

  2. 應用模型層。該項目將包含您的所有應用程序邏輯(與域邏輯相反):查看模型和控制器。它不需要引用DAL,但會獲得DI容器注入的實現。

0

沒有什麼錯在具有Web項目的DAL的參考,只要你不直接進行到組裝調用。但是,如果您對此方法感到不舒服,則可以在業務層中使用註冊表,併爲DAL註冊類型。由於網絡層無論如何都會需要有業務層中的參考,您可以使用從業務層註冊表中的Web的應用程序啓動

下面是一些示例代碼

在BSNS層

註冊表類
public class BusinessRegistry:Registry 
{ 
    public BusinessRegistry() 
    { 
     For<IDALInterface1>().Use<DALImpl1>(); 
    } 
} 

,並在應用程序啓動方法

var container = new Container(x => x.AddRegistry(new BusinessRegistry())); 
+0

如果假設有5個圖層,該怎麼辦......儘管我們可以在每個圖層中創建註冊表,但是我們只能在application_start中初始化它們......所以我們無論如何都需要所有5個圖層的引用...有沒有解決這個問題... – 2011-01-23 06:06:34

+0

5層意味着5個項目。如果是這樣的話,我會回去重新設計整個事情。項目越少越好。無論如何,你最初的問題,我會推薦@Seemann建議下面,有一個引導項目,將初始化與所有依賴關係DI容器 – Hakeem 2011-01-23 14:53:36

+0

是hakeem,我將與seeman的方法..感謝 – 2011-01-24 07:02:08

0

和其他人一樣,對你的DAL項目的引用不是世界末日,除非你錯誤地使用它(或者可能在你的web項目中)。我更喜歡有一個基礎設施項目包含與交叉關注相關的所有事情。除此之外,這包括我的日誌記錄和IoC容器。