關於DTO的定義問題。以及C#語言擴展的思考。


數據傳輸對象 是我們經常用到的一個東西。有時候我們稱之為的ViewModel也屬於其中之一。

但是以往,我們總是 復制 實體類型的一些字段 然后單獨創建這些對象。然后我們使用對象映射工具 進行值層面的映射比如AutoMapper。

我感覺 DTO只是對實體或者持久化數據的引用及擴展
而我們現在定義了太多的 對象。一遍又一遍地從實體copy出需要的字段 變成DTO,但是隨着業務的變化,改進和迭代,涉及到實體以及眾多的DTO的修改,讓我們的維護也變得更加困難(分散的,改了一個地方要改很多地方,而且有時候難免漏掉造成bug)。
這嚴重違反了DRY 原則

下面我們看下一個新的定義方式:

 

class Entity{

string Name;

NewCmd:Entity|CreateDate:DBDate()
SearchQuery:Entity(!Name)|Key:DBText(20)|

 

bool Create(NewCmd newcmd){....}

bool Query(SearchQuery newcmd){....}

}

NewCmd 繼承了 Entity的所有字段,並且擴展了一個CreateDate字段。

SearchQuery 繼承了 Entity中除了Name之外的所有字段,並且擴展了一個Key字段。

應該說這樣的DTO邏輯一目了然,最重要的是當底層 Entity修改的時候。我們的DTO也隨之修改了。

 

所以 DTO在語義上 應該 是對持久化實體的引用和擴展
可以屏蔽某些字段也可以擴展某些字段

這樣 就舒服了
但是這需要語言層面的支持


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM