2011-03-31 24 views
0

請幫助選擇正確的方式來使用n層web應用程序中的實體。 就目前而言我在它下面assembleis:請幫助選擇正確的n層Web應用程序的架構

enter image description here

  1. 模型(自定義實體)描述了類應用程序使用的領域。
  2. 驗證使用反射屬性方法驗證UI中的數據完整性(檢查所有圖層中的數據)。
  3. BusinessLogicLayer是使用DataAccessLayer中的抽象數據提供程序的附加邏輯和高速緩存的業務外觀。
  4. DataAccessLayer使用LinqtoSql數據上下文和Linq查詢覆蓋abstarct數據提供程序。這裏有一點讓我覺得自己出錯了...... 我的DataLayer在將數據發送到業務層之前,使用映射器將從數據庫檢索到的數據映射(轉換)爲模型類(自定義實體)。它看起來像這樣:

    internal static model.City ToModel(this City city) 
    { 
        if (city == null) 
        { 
         return null; 
        } 
    
        return new model.City 
        { 
         Id = city.CountryId, 
         CountryId = city.CountryId, 
         AddedDate = city.AddedDate, 
         AddedBy = city.AddedBy, 
         Title = city.Title 
        }; 
    } 
    

所以映射器映射數據對象的描述模型。這是正確和常用的方式來處理實體,還是必須將數據對象用作實體(以獲得時間)?我清楚了嗎?

回答

1

從服務邊界(WCF服務等)發出DTO可能是一種常見的做法,但如果您直接在您的演示模型中使用您的「實體」,我認爲沒有任何好處。

至於你提供的代碼片段,爲什麼不使用AutoMappter?它有助於消除鍋爐板映射代碼的寫作,併爲您提供幫助,如果您有一套慣例的話。

+0

問題不在於映射器本身。問題是關於使用模型的必要性 – Roman 2011-03-31 10:32:37

+0

更新了答案。 – 2011-03-31 10:33:44

2

如果你的項目是POCO,你可以在你的項目中使用你的數據實體。否則,我會像你所做的那樣創建單獨的模型。但是請將它們保存在單獨的程序集中(不在DataAccess項目中)

但我不會通過web服務公開它們。

其他建議

恕我直言的人濫用層。大多數應用程序不需要很多層。我目前的客戶有一個像您的應用程序一樣的架構。問題是隻有數據訪問層和表示層在其中存在邏輯,所有其他層僅從下層獲取數據,對其進行轉換並將其發送到上面的層。

我做的第一件事就是告訴他們放棄所有層,而使用這樣的事情(需要IoC容器):(通過一個ORM包含業務規則和數據訪問)

  • 核心
  • 規格(分隔接口模式。包含的服務接口和模型)
  • 用戶界面(可能是一個Web服務,的WinForms,Web應用程序)

,對於大多數申請工作ication。如果您發現核心增長並變得太大,您可以分割它而不影響任何用戶界面。

您已經在使用ORM,並且您是否考慮過使用驗證塊(FluentValidation或DataAnnotations)進行驗證?使您可以輕鬆驗證所有圖層中的模型。

0

現在擺脫模型,之後刪除它將需要重構整個應用程序。我最後一個項目使用了這個架構,並且維護DTO層和映射到數據庫模型層是一個巨大的痛苦,並且沒有提供任何有用的好處。令人厭煩的主要事情之一是LinkToSql無法有效支持斷開連接的數據模型。您無法通過創建具有與現有記錄匹配的主鍵的新數據庫實體來更新數據庫表,然後將其粘貼到數據上下文中。您必須首先從數據庫中檢索實體,更新它然後提交更改。管理這個會導致非常討厭的更新方法,將所有屬性從DTO映射到LinqtoSql類。它也打破了LinqToSql的整個延期執行模型。甚至沒有讓我開始討論它是由父類的屬性引起的問題,這些父類是子DTO的集合(例如,一個訂單屬性包含訂單DTO集合的客戶DTO),管理這些映射真的非常煩瑣,我必須做一些廣泛的優化,因爲檢索幾百條記錄最終導致LinqToSql進行200,000次數據庫調用(誠然,也有一些非常笨拙的代碼,但你得到的圖片)。

使用DTO的唯一正當理由是如果您想要有多個可插入數據訪問層例如LinqToSql和NHibernate支持不同的數據庫服務器。這樣,您可以在以後更換數據訪問,而無需更改任何其他圖層。如果你不需要這樣做,那就救一個痛苦的世界,然後使用LinqToSql實體。