关于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在语义上 应该 是对持久化实体的引用和扩展
可以屏蔽某些字段也可以扩展某些字段
这样 就舒服了
但是这需要语言层面的支持
关于DTO的定义问题。以及C#语言扩展的思考。的更多相关文章
- C语言扩展Python模块
1. 先创建一个PythonDemo.cpp文件: //c/c++中调用python脚本,配置步骤参见上一篇:C/C++与python交互 \ C/C++中调用python文件. #include ...
- Azure Table storage 之改进DynamicTableEntity类为其添加动态语言扩展
在之前的一篇文章中提到,storage类库中包含一个可以用来动态获取Azure table storage 表结构的类-DynamicTableEntity. 我们可以通过这个类,我们无需为每一个表提 ...
- javascript语言扩展:可迭代对象(3)
除了前2篇文章中描述的可迭代对象以外,在js语言扩展中的生成器对象,也可以作为可迭代对象. 这里用到一个新的关键字yield,该关键字在函数内部使用,用法和return类似,返回函数中的一个值:yie ...
- R语言扩展包dplyr——数据清洗和整理
R语言扩展包dplyr——数据清洗和整理 标签: 数据R语言数据清洗数据整理 2015-01-22 18:04 7357人阅读 评论(0) 收藏 举报 分类: R Programming(11) ...
- C#高级编程9-第12章 动态语言扩展
C#高级编程9-第12章 动态语言扩展 dynamic t = new ExpandoObject(); t.Abc = "abc"; t.Value = ; Console.Wr ...
- Haskell语言学习笔记(88)语言扩展(1)
ExistentialQuantification {-# LANGUAGE ExistentialQuantification #-} 存在类型专用的语言扩展 Haskell语言学习笔记(73)Ex ...
- 使用C语言扩展Python3
使用C语言扩展Python3.在Python3中正确调用C函数. 1. 文件demo.c #include <Python.h> // c function static PyObject ...
- javascript语言扩展:可迭代对象(1)
在ECMAScript中我们知道可以通过for in语句进行对象属性的遍历,当然这些属性不包括继承而来的属性: var ary = [1,2,3,"aa",4]; for(i in ...
- R语言扩展包dplyr笔记
引言 2014年刚到, 就在 Feedly 订阅里看到 RStudio Blog 介绍 dplyr 包已发布 (Introducing dplyr), 此包将原本 plyr 包中的 ddply() 等 ...
随机推荐
- 第四节:Geo类型介绍以及Redis批量操作、事务、分布式锁
一. Geo类型 1. 类型说明 Geo 是 Redis 3.2 版本后新增的数据类型,用来保存兴趣点(POI,point of interest)的坐标信息.可以实现计算两 POI 之间的距离.获取 ...
- kali渗透综合靶机(四)--node1靶机
kali渗透综合靶机(四)--node1靶机 靶机下载地址::https://download.vulnhub.com/node/Node.ova 一.主机发现 1.netdiscover -i et ...
- C# Large Files MD5 C# 获取大文件MD5
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- ASP.NET MVC过滤器学习笔记
1.过滤器的两个特征 1.他是一种特性,可以引用到控制器类和Action方法上.比如下图 这里控制器类和action方法都引用了过滤器,这个过滤器是用来做授权的 2.特征继承自FilterAttrib ...
- JavaScript 设计模式分类
设计模式的目的是为了提高代码的整洁性.降低代码的资源占用量. JS中的设计模式可分为以下三种: 1. 创建型设计模式 说明:专注于处理对象创建的机制,以合适的方式创建对象,以此来降低创建对象过程的复杂 ...
- Vertx上传 官网Demo Java版
package io.vertx.example.web.upload; import io.vertx.core.AbstractVerticle; import io.vertx.example. ...
- WPF控件模板(6)
什么是ControlTemplate? ControlTemplate(控件模板)不仅是用于来定义控件的外观.样式, 还可通过控件模板的触发器(ControlTemplate.Triggers)修改控 ...
- Java网络编程 -- Netty中的ByteBuf
由于JDK中提供的ByteBuffer无法动态扩容,并且API使用复杂等原因,Netty中提供了ByteBuf.Bytebuf的API操作更加便捷,可以动态扩容,提供了多种ByteBuf的实现,以及高 ...
- JMETER 用户变量作用域
在编写JMETER 脚本时,我们会使用到变量,变量的作用域是线程. 我们通过下面的脚本验证一下变量的返回是线程. 1. 我们先定义一个amount的流程变量. 2.线程组使用三个线程 3.在线程组中添 ...
- 8、RabbitMQ三种Exchange模式(fanout,direct,topic)的性能比较
RabbitMQ三种Exchange模式(fanout,direct,topic)的性能比较 RabbitMQ中,除了Simple Queue和Work Queue之外的所有生产者提交的消息都由Exc ...