.net 如果使用POCO+,有任何缺点;跨层的实体框架,而不使用数据传输对象?

.net 如果使用POCO+,有任何缺点;跨层的实体框架,而不使用数据传输对象?,.net,wcf,entity-framework-4,poco,.net,Wcf,Entity Framework 4,Poco,跨层(DAL、BLL和Presentation)使用相同的POCO(在EF4和WCF中)和不使用DTO是否有任何缺点?客户端和服务都是.NET&整个应用程序并不是特别大 我这样问是因为在不同的层之间以不同的格式移动相同的数据以及进行转换和映射似乎很麻烦&增加了复杂性。它的开发和维护更加耗时,而且容易出错。我不确定添加DTO是否值得,即使DTO是在运行时生成的,或者使用了DTO生成器 在我开始设计和编写新的web应用程序时,我希望看到一些意见。通过网络意味着您的数据可以通过网络看到 一旦用户成功通

跨层(DAL、BLL和Presentation)使用相同的POCO(在EF4和WCF中)和不使用DTO是否有任何缺点?客户端和服务都是.NET&整个应用程序并不是特别大

我这样问是因为在不同的层之间以不同的格式移动相同的数据以及进行转换和映射似乎很麻烦&增加了复杂性。它的开发和维护更加耗时,而且容易出错。我不确定添加DTO是否值得,即使DTO是在运行时生成的,或者使用了DTO生成器


在我开始设计和编写新的web应用程序时,我希望看到一些意见。

通过网络意味着您的数据可以通过网络看到

一旦用户成功通过身份验证,任何网络工具都可以显示所传递的所有数据。如果您正在传递整个实体,并且在ui中只显示实体的过去,那么您假定用户不会看到隐藏的数据。但使用任何网络跟踪工具,一切都是可见的

您必须想象您实际上正在发送完整的数据,而UI只是一个演示

所以,如果用户可以通过网络跟踪查看数据,那么就没有什么可担心的了

但请记住,一些恶意的人可能会试图操纵数据,考虑到用户永远无法访问数据,您可能会忽略这些数据。例如,您可以将用户名设置为只读字段,您的ui将不允许用户修改,但有人可以轻松编写wcf客户端代码以连接到您的服务

大多数问题都是由外键引起的,如果有人操纵外键,将很难验证对象的所有权


您必须假设每一个在线请求都是有害的,并且必须检查所有可能性的安全性

使用DTO的主要动机之一是需要跨线路传输对象表示

如果您在单个进程中使用域模型对象,那么在整个过程中只使用相同的对象就可以了

另一方面,如果您计划序列化对象并将其发送到其他进程,例如通过web服务,则通常最好使用两个进程之间约定的DTO形式来完成。可用于充实本合同协议。这两个进程都可能使用同一个数据协定程序集从中序列化并反序列化回

这种体系结构中的每个流程可能有不同的目的(因此分离),因此与对象有不同的需求,例如,一个流程可能是只涉及表示的GUI,一个流程可能是涉及对象变化的业务逻辑层,允许他们在遵守业务规则的同时进行交互,另一个可能是仅涉及持久性的数据访问层,另一个可能是涉及转换报告引擎的对象等的非规范化器。这意味着层之间的需求中唯一可能的共同点是数据表示,即DTO或数据契约,而不是富域模型对象的行为。在给出的示例中,唯一需要具有行为的富对象的层是业务逻辑层


DTO可能也是在AppDomains之间传输对象表示的更好方法,如果需要这样做的话。

缺点开始了,这只是一个例子,但想象一下,您的UI设计师会提出一个简单而无辜的问题。我们不能将实体在屏幕上绘制的位置的x和y位置存储在实体本身中吗?实体上不能有一个“Selected”属性来指定当前是否选中它吗?而你认为:一个选定的属性,地狱不!我不可能把它写进数据库,那没有任何意义。然后他们希望您的POCO实现
INotifyPropertyChanged
,并获取一些自定义事件,等等

DTO和映射的优点是将层解耦。您正在提高根据每个层的要求自定义对象的能力


现在有一些简洁的映射工具可以使这项任务变得非常简单。是其中之一。使用T4模板是另一个问题。

“我希望看到一些意见…”我不打算对此进行标记,但这个问题应该是关于“程序员”而不是堆栈溢出吗?我仍然不知道什么属于堆栈溢出,什么属于程序员:-),这就是问题所在。所以它只是被放在上面,因为它获得了更多的流量。如果主题太笼统,那么它可以交给程序员。我个人希望程序员SE不存在,因为它将社区一分为二。可以用一个特殊的标签。@Tony-我同意。我看到过一些关于这方面的争论,但似乎仍然有足够多的程序员支持者支持它。在我看来,这两者之间的区别太微妙了,似乎有很多问题处于两者之间的灰色地带,甚至可能符合每个网站所属内容的描述。一个问题的“主观性”取决于谁在问它是否是主观的,这也表明区别本身是主观的。事实上,这么多人觉得这种区别太模糊或微妙,最终不理解它,这表明它不应该存在。