簡體   English   中英

洋蔥架構:我們應該在域實體中允許數據注釋嗎?

[英]Onion Architecture: Should we allow data annotations in our domain entities?

我希望將Onion Architecture實現到我們的ASP.NET MVC應用程序中。 我理解將視圖模型與域實體分開的必要性,但我發現自己正在編寫冗余代碼。 存在冗余代碼,因為我的視圖模型和域實體看起來完全相同,除了我的視圖模型具有[Serializable]數據注釋。 我需要這些模型可序列化,因為我使用的是ASP.NET會話狀態,其中State Server需要對象可以序列化。

我個人覺得域實體不應該是可序列化的,因為它會依賴於特定的技術。 但是,如何避免冗余代碼?

我應該補充一點,我的服務方法依賴於這些可序列化的數據模型。

我會避免使用任何持久性或非域相關的東西來注釋我的域對象。 這樣,我的Domain項目就不會依賴於另一個層了,我也不會把它與那些與Domain無關的東西弄得亂七八糟。 雖然我們需要彎曲規則,但我更喜歡以不依賴於持久性細節的方式彎曲它們。

重點在於保持層次集中在它們的目的上,因為它很容易混合起來並創造(及時)大泥球。

在你的情況下,我覺得你沒有真正擁有豐富的域名或者它是不正確的建模。 看起來你只有數據結構,你的需求是CRUDy。

如果您確定應用程序不會變得更加復雜,即它只是數據結構操作,那么您可以使用一個模型將它們用於所有目的。 基本上你可以偷工減料,並將“商業”模式用於一切。 不需要抽象和其他東西。

但是如果您認為應用程序將會發展,或者它們是或將成為業務規則和流程,即您需要模擬業務所感知的行為,那么最好將事物保持非常分離,即使在此階段它們似乎是相同。

為了方便起見,您可以為視圖模型定義一個(使用復制粘貼)並使用automapper將業務對象映射到視圖模型。 其他方法可能是您的查詢服務/存儲庫/對象可以直接返回該視圖模型(將查詢結果映射到視圖模型)

Viewmodels可以包含域實體/模型。 我的域實體是部分類,並且所有(最終)都從序列化的基本實體繼承。 由於我在一些視圖模型中使用了我的域模型,因此我也在域模型上使用數據注釋。 您的域模型庫不應依賴/引用其他任何內容(域驅動)。

我不會將[Serializable]本身稱為數據注釋,因為它是核心.Net平台(mscorlib.dll)的一部分。 數據注釋是指用於在ASP.Net或實體框架中執行數據驗證和其他操作的特定屬性

實體是否應該[Serializable] 可能不是,但我認為這個屬性不像來自外部,面向Web或面向持久性的庫的其他屬性那樣“摻雜”到您的域層。 它不會將您綁定到特定的第三方框架。

整個“冗余代碼”問題取決於IMO您正在構建的系統類型。 在真正的DDD應用程序中,域實體和視圖模型之間的重復可能不會那么明顯,單獨的表示模型的好處通常會超過成本。 關於該主題的一篇好文章: 分層值得映射

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM