.net N层POCO/DTO困境

.net N层POCO/DTO困境,.net,orm,separation-of-concerns,.net,Orm,Separation Of Concerns,当只有邪恶的数据集和microsoft应用程序块时,层之间的传输对象可能是数据集/数据表或DTO/POCO。我属于喜欢使用DTO/POCO的帮派 现在,随着亚音速、实体框架、NHibernate等映射层的突然兴起,我还应该使用我最喜欢的POCO吗??我主要是这样做的,当使用ASP.net webforms时,99%的情况是使用ObjectDataSource绑定到控件和特定于每种类型的功能 我是否应该放弃对POCO的热爱,传递iQueryable、实体或类似的东西,并利用其他数据源对象 使用这些

当只有邪恶的数据集和microsoft应用程序块时,层之间的传输对象可能是数据集/数据表或DTO/POCO。我属于喜欢使用DTO/POCO的帮派

现在,随着亚音速、实体框架、NHibernate等映射层的突然兴起,我还应该使用我最喜欢的POCO吗??我主要是这样做的,当使用ASP.net webforms时,99%的情况是使用ObjectDataSource绑定到控件和特定于每种类型的功能

我是否应该放弃对POCO的热爱,传递iQueryable、实体或类似的东西,并利用其他数据源对象

使用这些对象而不是DTO的优缺点是什么??它将如何影响我的应用程序设计和性能


编辑:我什么时候可以使用其他数据源,如Linq Datasorce和Entity datasource等?

POCO和DTO的长寿命。它们是轻量级的、易于序列化的、强类型的、可绑定的。它们从来没有任何性能问题,总是让我的高级代码更干净

使用nHibernate或其他可以映射到POCO:-)的ORM,然后您可以根据您希望生产者和消费者之间的距离来决定通过DTO或POCO

我想问的问题是,您是否要将数据拉入实体/iQueryTables,然后将它们转换为DTO?这是一个非常有效的模式,特别是当您要转换服务边界并且不想公开您的域模型时;然而,有一个权衡。根据数据的大小,对性能的影响最小,但这是您需要考虑的

最近,我不得不在下拉列表中显示一组组织对象的列表。组织有许多属性和其他子对象。我在下拉列表中不需要任何东西我只需要一个ID和名称,还有一些额外的属性

以下是我的HQL查询,用于搜索数据库并返回使用nHibernate的DTO列表:

      return CurrentSession.CreateQuery(
            "select new OrganizationListDTO(o.Id,o.Name,o.xxx,o.xxx)" +
            " from Organization i where i.State=:state")
            .SetParameter("state", state)
            .List<IOrganizationListDTO>();
return CurrentSession.CreateQuery(
选择新组织列表DTO(o.Id、o.Name、o.xxx、o.xxx)+
“来自组织i,其中i.State=:State”)
.SetParameter(“状态”,状态)
.List();

这里的要点是,即使您使用ORM,您仍然可以利用DTO进行类似报告的查询,并让它完成所有繁重的工作

我发现域和DTO的并行对象树不一致。即使我使用代码生成器,要维护的额外代码也不会给我带来太多好处。我认为图层纯度过高。我不是DTO迷。

我也在这一次的十字路口。对于SOA,除了技术约束之外,还有其他的原则必须考虑,如果你想保持正确的轨道。我看到一些人(包括我自己)将这场辩论进一步推进,并质疑如何交换业务对象(BO)。但我开始意识到这违反了最基本的SOA原则之一——自治。这样做会突然将您的服务绑定到业务细节。这只是我想提出的一个场景,与DataContract和“实体”问题进行比较。我认为原则才是最重要的——即使是少量冗余的成本(即专用DTO)。为此,我更倾向于使用适配器模式,以保持消息传递“基础设施”和EDM等面向丰富组件的模型的独立性。此外,使这个“适配器模式”成为一个全面的实体服务候选者将使它在SOA世界中更加优雅、可重用和自治。Thomas Erl在《面向服务的体系结构(概念、技术和设计)》一书中出色地描述了“以实体为中心的服务”的概念。另一件需要思考的事情是:如果我的“实体”不存在于单个源中(即部分位于数据库中,部分位于文本文件或电子表格中),该怎么办?通过DTO和/或成熟的以实体为中心的服务,您可以隐藏这一点,并提高更高的灵活性


底线:如果您不关心SOA原则,并且正在开发更多的“临时”,那么请选择。但是,如果您处于企业或B2B的位置,并且根本无法冒着SOA打算驯服的臭名昭著的“临时爬行”风险,那么您可能会作为一流公民提供以SOA实体为中心的服务,并对其进行管理。考虑计算在哪里(SOA、SaaS、PaaS等等),以及它们共享的范式和原则。

如果你的DTO是1:1的域对象的地图,它是毫无意义的。如果您的DTO是指一个子集、一个集合或多个对象,那么它会带来很大的好处。当您与第三方客户打交道时,DTO也有一个位置,我不会将adomain对象用于数据契约……对于那些不是.NET大师的人来说,DTO=数据传输对象,POCO是普通的旧CLR对象(来源Wikipedia)。DTO=对象,通常只有存储/检索一组字段的方法作为其唯一行为。POCO=标准C#/VB/J#/etc.对象