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

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

可是以往,咱們老是 複製 實體類型的一些字段 而後單首創建這些對象。而後咱們使用對象映射工具 進行值層面的映射好比AutoMapper。工具

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

下面咱們看下一個新的定義方式:繼承

 

class Entity{cmd

string Name;string

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

 

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

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

}引用

NewCmd 繼承了 Entity的全部字段,而且擴展了一個CreateDate字段。

SearchQuery 繼承了 Entity中除了Name以外的全部字段,而且擴展了一個Key字段。

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

 

因此 DTO在語義上 應該 是對持久化實體的引用和擴展
能夠屏蔽某些字段也能夠擴展某些字段

這樣 就舒服了可是這須要語言層面的支持

相關文章
相關標籤/搜索