關於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在語義上 應該 是對持久化實體的引用和擴展
可以屏蔽某些字段也可以擴展某些字段

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章