c# - 填充 DTO 的正确方法是什么

标签 c# .net architecture dto

我正在使用 DTO(数据传输对象)在我的应用程序的不同层之间传输信息。

关于性能和填充这些对象的方式,最佳做法是什么?我是否应该使用来自数据访问层的不同方法仅填写最少的必需信息?

假设我有以下类(class):

public class Order
{
    public int OrderNo;
    public Customer Customer;
    public double Total;
}

public class Customer
{
    public int CustId;
    public string CustName;
    public Country Country;
}

public class Country
{
    public int CountryId;
    public string CountryName;
}

如果我需要生成包含 OrderNo、CustName 和 CountryName 的订单列表,而在另一种情况下,不同的信息可能来自不同的表(或 DTO),会发生什么情况?最好使用仅包含必填字段的扁平化 DTO 还是使用 LINQ 进行查询?

我希望我说得够清楚了。

谢谢你的帮助!

编辑: 我想知道的是我是否应该填充所有嵌套对象,而不仅仅是对象的一部分属性。

最佳答案

我认为这将取决于您的 DTO 使用的广泛程度以及它们的复杂程度。对于如图所示的简单字段,填充所有字段不太可能对性能产生重大影响,并且使用通用映射代码会更容易。对于复杂对象图中的大量数据集,这将是一个更大的问题。

如果性能确实是一个问题并且您可以衡量通过更改获得的改进,我只会担心展平对象或取消 DTO(假设它们完全有意义)。

关于填充 DTO,我们同时使用 LINQ 和 AutoMapper在多层 ASP.NET MVC 应用程序中广泛使用。在我们的业务对象和传递给 View 的哑 View 模型对象之间进行映射时,AutoMapper 非常有用。虽然我们没有世界上最大的数据库,但我们有一个相当复杂的模式,并且没有因为映射而真正遇到任何性能瓶颈。

我们看到性能问题的一个地方是过早评估的 LINQ 查询,这些查询会拉回大量对象图,而不仅仅是所需的。通过检查“select new”是否在正确的时间执行,我将通过网络从数据库中提取 850 MB 数据的一个查询减少到 1.3 MB!

关于c# - 填充 DTO 的正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4657622/

相关文章:

c# - 绑定(bind)WPF int和int?

c# - 加密/解密数据到数据库

.net - .NET 中的强类型装箱值

C# Linq to CSV 动态对象运行时列名称

javascript - react .js : reusable components vs mixin's utility functions

c# - WCF maxBytesPerRead 限制为 4096

c# - 无法加载文件或程序集或其依赖项之一

algorithm - Redis 类似 Twitter 的关注/取消关注设计模式

c# - 如何在 TPL 中停止播放并返回正确的值?

algorithm - 有哪些非常适合整数线性规划的问题示例?