gpt4 book ai didi

.net - DTO 和 IQueryable : assembling and disassembling DTOs

转载 作者:行者123 更新时间:2023-12-02 15:42:51 25 4
gpt4 key购买 nike

我正在开发一个项目,该项目使用汇编器模式将 LinqToEntity 实体组装成服务级别的数据传输对象,然后将其传递到客户端层以供使用。该方法是将实体对象转换为简化的平面对象,提供特定于服务调用的信息。

例如。

// Original Entity looks something like this
public class PersonEntity
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public int MotherId { get; set; }
public PersonEntity Mother { get; set; }
// lots of other properties
}

// Flattened DTO
public class PersonSummaryInfo
{
public int Id { get; set; }
public string FullName { get; set; }
public string MothersFullName { get; set; }
}

在此示例中,汇编器将创建一个 PersonSummaryInfo,构造该过程的 FullNames 部分。

我现在面临一些第 3 方控件(Telerik ASP.NET MVC GridControl)的问题,其中控件设置为基于其模型属性进行过滤(使用 IQueryable)。似乎有一种想法是采用单层设计并将数据库实体直接注入(inject) View 中,这是我无法忍受的。

尝试将其合并到我的逻辑中,GridControl 绑定(bind)到我的 DTO 而不是实体,这一切都很好,直到它尝试对任何内容进行排序。我以一种非常通用的方式将所有 IQueryable 内容推送到我的服务中,以使其对此负责。排序尝试按 DTO 上的 MothersFullName 进行排序(其行为是将“MothersFullName”作为字符串传递给排序逻辑),这会被推送到我的服务,该服务通过反射尝试对实体进行排序,利用 IQueryable 惰性加载,但是当然,当执行查询时,会抛出异常,因为“MothersFullName”不是原始实体的属性。

是否有一个好的策略来处理这种实现?一旦 DTO 回到应用程序的服务层,有效地将 DTO“分解”回其 ORM 实体是一种好的做法吗?还是传递更丰富的对象来更好地了解它们的含义(例如如何使用 FirstName 和 LastName 对全名进行排序)?

我的要求的关键是:

  • 使用精美的 Telerik 控件,因为他们喜欢它
  • 服务级别的延迟加载结果(即不带回 200 万条记录,只显示 10 条)
  • 支持过滤、分页等
  • 完善的架构实现

最佳答案

您面前有几个选择。首先,确实能够绑定(bind)到 IQueryable,因为当然就开发时间而言,这是最快(也是最常见)的方法。

就您的情况(ORM 之上的完整服务层)而言,情况有点不同。我个人建议您稍微挖掘一下并提供 custom bindings到你的网格。您将获得一个 GridCommand 对象,您可以查询该对象以进行排序和过滤,并使用它向服务层请求数据。这是一个很好的地方,可以提及解决您所面临的问题的简单方法(即您的表达式基于 DTO 属性)。您可以尝试使用Dynamic Linq 。只需从表达式构建字符串查询并将它们传递到 DAL 即可。

事实上,这是 Telerik 的另一个产品 OpenAccess ORM 建议的最佳实践。 OpenAccess SDK包含几个使用与您的架构类似的架构的示例(尤其是 WCF 普通服务示例)。该产品还提供了code generation tool它提供了一个完整的服务层。

关于.net - DTO 和 IQueryable : assembling and disassembling DTOs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10952756/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com