问题标签 [dto]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
2529 浏览

repository-pattern - 从多个 DTO 构造域对象

假设您有规范的客户域对象。您在三个不同的屏幕上显示客户:外部管理员、内部管理员和更新帐户。

进一步假设每个屏幕仅显示 Customer 对象中包含的所有数据的一个子集。

问题是:当 UI 从每个屏幕传回数据时(例如通过 DTO),它只包含完整客户域对象的子集。因此,当您将该 DTO 发送到客户工厂以重新创建客户对象时,您只有客户的一部分。

然后您将此客户发送到您的客户存储库以保存它,一堆数据将被清除,因为它不存在。悲剧接踵而至。

所以问题是:你将如何处理这个问题?

我的一些想法:

  • 在存储库中包含一个参数,指示要更新客户的哪一部分,并忽略其他部分

  • 当您加载客户时,将其保存在静态内存中、会话中或任何地方,然后当您从 UI 接收到其中一个 DTO 时,仅更新与 DTO 相关的部分

IMO,这两者都是kludges。还有其他更好的想法吗?

@chadmyers:这是问题所在。

实体具有属性 A、B、C 和 D。

DTO #1 包含 B 和 C 的属性。

DTO #2 包含 C 和 D 的属性。

UI 要求 DTO #1,您从存储库加载实体,将其转换为 DTO #1,仅填写 B 和 C,然后将其提供给 UI。

现在 UI 更新 B 并将 DTO 发回。您重新创建实体,它只填写了 B 和 C,因为这就是 DTO 中包含的全部内容。

现在您要保存仅填充了 B 和 C 的实体,其中 A 和 D 为空/空白。存储库无法知道它是否应该将持久性中的 A 和 D 更新为空白,或者是否应该忽略它们。

0 投票
2 回答
1293 浏览

web-services - 如何为 WebService 暴露构建 DAL?

我们有一个高度专业化的 DAL,它位于我们的数据库之上。我们的应用程序需要使用此 DAL 才能正确操作此数据库。

生成的 DAL(位于一些自定义基类上)具有各种“Rec”类(Table1Rec、Table2Rec),每个类都表示给定表的记录结构。

这是一个示例伪类......

每个类都有每个字段的属性......因此我可以写......

在字段可以接受 NULL 值的情况下,还有一个附加属性指示该值当前是否为 null。

因此....

这是因为类的构造函数将所有 NULL 属性设置为 True,并且任何 FieldProperty 的设置都会导致等效的 NullProperty 设置为 false。

我最近需要通过网络服务(我当然打算保护它)在网络上公开我的 DAL,并且发现虽然“Rec”类的结构在网络上保持不变......所有逻辑都是丢失..

如果有人要远程运行前一段代码,他们会注意到这两个条件都不会被证明是正确的,因为没有客户端代码将 null 设置为 true。

我觉得我把这一切都错了,但看不出我应该如何改进它。

构建这个的正确方法是什么?

0 投票
2 回答
667 浏览

datatable - 您更喜欢哪一个来搜索/报告 DataTable 或 DTO 或域类?

我目前正在从事的项目需要大量搜索/过滤页面。例如,我有一个复杂的搜索页面,可以按数据、类别、单位、...

问题域类很复杂,包含大量的值对象和子对象。

.我想知道人们如何处理 UI 的搜索/过滤/报告。据我所知,我有 3 个选择,但没有一个能让我更快乐。

1.) 将参数发送到 Repository/DAO 以获取 DataTable 并将 DataTable 绑定到 UI 控件。例如到 ASP.NET GridView

在这个选项中,我可以简单地通过域层并查询给定规格的数据库。而且我不必完全构建复杂的域对象。不需要值对象,子对象,.. 直接从数据库中获取数据以显示在 UI 中的 DataTable 中并显示在 UI 中。

但是如果必须在 UI 中显示计算字段,例如方法返回值,我必须在数据库中执行此操作,因为我没有完整的域对象。我必须复制逻辑和 DataTable 问题,比如没有智能感知等......

2.) 将参数发送到 Repository/DAO 以获取 DTO 并将 DTO 绑定到 UI 控件。

在此选项中与上述相同,但我必须为每个搜索页面创建贫血的 DTO 对象。另外对于不同的问题搜索页面,我必须显示问题对象的不同部分。IssueSearchDTO、CompanyIssueTO、MyIssueDTO ....

3.) 将参数发送到 Real Repository 类以获得完全构造的域对象。

我喜欢领域驱动设计和模式。此选项中没有 DTO 或重复逻辑。但在此选项中,我必须创建许多子对象和值对象,这些对象不会在 UI 中显示。此外,它还需要大量的 ob 连接才能获得完整的域对象和针孩子的性能成本对象和值对象。

我不使用任何 ORM 工具也许我可以为这个版本手动实现延迟加载,但它似乎有点矫枉过正。

你更喜欢哪一个?还是我做错了?有什么建议或更好的方法吗?

0 投票
2 回答
5274 浏览

asp.net - 应该在哪个项目层筛选 DTO 的存在?

我有一个项目,我们使用屏幕 DTO 来封装服务层表示层之间的数据。在我们的例子中,表示层是 ASP.Net。

唯一知道 DTO 的类是服务层类和调用这些服务并显示 DTO 的页面/控件。

DTO 几乎总是特定于页面/控制,所以我觉得它们属于表示层,但这意味着服务层必须引用表示层才能使用 DTO。

我几乎认为服务层应该返回更丰富的对象(但不是域实体?),然后表示层可以获取这些对象并将它们映射到每个页面/控制问题的非常具体的 DTO。

这是一个接口声明和一个 DTO,因此您可以看到我在说什么:

编辑

这是另一个代码示例,用于描述不涉及域模型的用例。也许这会澄清一些事情。我相信我已经超载了 DTO 的含义。我不是在谈论通过网络传输对象的功能的 DTO。我正在创建 DTO 来正式确定与我的服务层的通信之间的合同。

假设我的身份验证突然需要一个 IP 地址参数。我现在可以将该属性添加到 DTO,而无需更改我的合同接口。

我不想将实体传递给我的表示层。我不希望我的代码后面有能力去BlogPost.AddComment(new Comment())

0 投票
6 回答
9242 浏览

asp.net - 如何有效地使用 DTO 对象(Data Transfer Objects)?

实施 DTO 的最佳方式是什么?

我的理解是它们是在对象之间传输数据的一种方式。例如,在 ASP.Net 应用程序中,您可能使用 DTO 将数据从代码隐藏发送到业务逻辑层组件。

其他选项呢,比如将数据作为方法参数发送?(这在要发送的数据较少的情况下最容易吗?)

一个只保存数据的静态类,可以被其他对象引用(一种全局汇编数据存储类)呢?(这是否会过多地破坏封装?)

每次传输都使用一个通用 DTO 怎么样?使用起来可能有点麻烦,但减少了需要使用的类的数量(减少了对象混乱)。

感谢您分享您的想法。

0 投票
2 回答
6781 浏览

c# - 如何在业务逻辑层设计数据传输对象

DTO

我正在构建一个希望扩展到许多用户的 Web 应用程序。此外,我需要通过 Web 服务向受信任的第三方公开功能。

我正在使用 LLBLGen 生成数据访问层(使用 SQL Server 2008)。目标是构建一个业务逻辑层,使 Web App 免受 DAL 细节的影响,当然,还提供 DAL 之外的额外验证级别。此外,据我现在所知,Web 服务本质上将是 BLL 的薄包装器。

当然,DAL 有自己的一组实体对象,例如 CustomerEntity、ProductEntity 等等。但是,我不希望表示层直接访问这些对象,因为它们包含特定于 DAL 的方法,并且程序集特定于 DAL 等等。因此,这个想法是创建数据传输对象 (DTO)。这个想法是,本质上,这些将是普通的旧 C#/.NET 对象,它们具有所有字段,例如 CustomerEntity,实际上是数据库表 Customer,但没有其他东西,除了一些 IsChanged/IsDirty 属性。因此,会有 CustomerDTO、ProductDTO 等。我假设这些将继承自基本 DTO 类。我相信我可以使用 LLBLGen 的一些模板生成这些,但我还不确定。

因此,这个想法是 BLL 将通过接受和返回这些 DTO 对象来公开其功能。我认为 Web 服务将处理将这些对象转换为 XML 以供使用它的第三方使用,许多可能没有使用 .NET(此外,有些东西可以通过 Web 应用程序上的 AJAX 调用使用 JSON 进行脚本调用)。

我不确定设计这个的最佳方法以及如何前进。这里有一些问题:

1)这应该如何暴露给客户端(表示层和Web服务代码)

我在想会有一个具有这些方法的公共类,每次调用都是原子操作:

InsertDTO、UpdateDTO、DeleteDTO、GetProducts、GetProductByCustomer 等等...

然后客户端只需调用这些方法并传入适当的参数,通常是 DTO。

这是一个好的、可行的方法吗?

2)从这些方法返回什么?显然,Get/Fetch 类型的方法将返回 DTO。但是插入呢?部分签名可能是:

但是,插入时应该返回什么?我想收到错误通知。但是,我对某些表使用自动递增主键(但是,一些表具有自然键,尤其是多对多表)。

我想到的一个选项是 Result 类:

因此,在插入时,DTO 将获取其获取 ID(如 CustomerDTO.CustomerID)属性集,然后放入此结果对象。如果 Result.Error != null 客户端将知道是否有错误,然后它会从 Result.AffectedObject 属性中知道 ID。

这是一个好方法吗?一个问题是,它似乎在来回传递大量冗余数据(当它只是 ID 时)。我不认为添加“int NewID”属性是干净的,因为某些插入不会有这样的自动递增键。另一个问题是我认为 Web 服务不能很好地处理这个问题?我相信他们只会在 Result 类中返回 AffectedObject 的基本 DTO,而不是派生的 DTO。我想我可以通过拥有大量不同类型的 Result 对象(可能从基本 Result 派生并继承 Error 属性)来解决这个问题,但这似乎不太干净。

好吧,我希望这不是太罗嗦,但我想清楚。

0 投票
3 回答
3262 浏览

linq-to-sql - Linq to SQL DTO 和复合对象

我使用与其他人类似的方法将我的 LINQ 对象保存在我的 LINQ 数据提供程序中并返回 IQueryable 以允许过滤等。这适用于通过其 ID 或其他属性过滤简单对象,但我遇到了问题连接由其他子对象组成的表对象

coreDB.Positions 是我的 Linq Position 对象,我返回一个 DTO Position,它由 User、OrgUnit 和 Role 组成(基础表是一个带有 UserID、RoleID 和 OrgUnitID 的连接表)

我遇到的问题是,当我尝试在 Iqueryable 上添加过滤器时,我收到一条 SQL 错误,提示我的 DTO.User 对象没有可用的翻译

我完全不知道如何解决这个问题,因为我所有的谷歌结果似乎都是与直接使用生成的 LINQ 对象的人一起工作的

关于如何完成这项工作的任何想法,或者我在这里做错了什么?

谢谢

0 投票
5 回答
174 浏览

.net - 分离和重构大量依赖类的最佳方法

我有大量的分层结构(或 DTO),它们在不同的业务逻辑、应用程序层、Web 服务和 WCF 合同之间共享。我想重构我的所有代码以将结构拆分为谨慎的业务领域。

两个问题:

  1. 是否有任何工具可以帮助我做到这一点(假设我想要 A 类,列出所有依赖项)?

  2. 是否有在不同应用程序域中复制 DTO 以允许它们独立发展的情况?固定的规范商业模式的想法纯属虚构!

0 投票
3 回答
3271 浏览

c# - nHibernate (w/ Castle ActiveRecord) 与 C# 接口 (esp for DTO's)

是否将 nHibernate 与从通用接口实现的域对象和 DTO 对象一起使用?我试图将我所有的 nHibernate 属性分离到 Domain 对象中,让我的 DTO 和界面保持干净。

当 nHibernate 尝试将接口与具体类相关联时,会出现问题。

NHibernate.MappingException:关联引用未映射的类:IContact

我理解为什么它抱怨使用非休眠界面,但我正在努力寻找一种围绕它进行重组的方法。我的代码的骨架复制如下所示,关于如何更好地构建我的代码的任何想法?

编辑:

我想要一个通用接口,这样我就可以确保它们保持相同的字段(即依靠编译器来保持它们的一致性)。它还允许我在应用程序的视图部分中使用 DTO,但将它们转换为域对象以进行业务和数据访问。此外,alex 的解决方案不起作用,因为 ICompany 的联系人是 IList 类型,而不是 IList。我想将其保留为 IContact,因此我的 DTO 对象不知道 Contact Domain 对象。

0 投票
2 回答
1244 浏览

c# - C# DTO 和 LINQ2SQL

这是我的第一个问题,要温柔:)。我正在从事具有某种分布式架构的项目。我正在尝试执行以下操作:

  1. 我有一个使用LINQ2SQL的数据访问层

  2. 我有一个服务层,它是数据访问层的代理。

  3. 我有一个为实体调用服务层的业务层

    问题是如何将这些 LINQ2SQL 实体转移到我的业务层?

  4. 我想修改业务层上的这些对象,并与服务层一起返回并将它们重新转换为 LINQ2SQL 实体以将更改保留在数据库中。

    如果我要求一些不可能的东西,我很抱歉,但我试图找出最好的方法,但我自己无法获得一些聪明的东西:)

    最好的祝福!