填写DTO的正确方法是什么

Jas*_*son 2 .net c# architecture dto

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

在性能和填充这些对象的方式方面,最佳做法是什么?我应该使用不同的方法从我的数据访问层填充最低要求的信息吗?

假设我有以下课程:

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;
}
Run Code Online (Sandbox Code Playgroud)

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

我希望我说得够清楚.

谢谢你的帮助!

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

Tim*_*don 6

我认为这将取决于您的DTO的使用范围以及它们的复杂程度.对于如图所示的简单,在填充所有字段时不太可能产生显着的性能影响,并且它将使得使用公共映射代码变得更容易.对于复杂对象图中的大量数据集来说,这将是一个更大的问题.

如果性能确实存在问题,我只会担心平面化物体或废弃DTO(假设它们有意义),您可以通过进行更改来衡量您将获得的改进.

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

我们已经看到性能问题的一个地方是过早评估的LINQ查询,这些查询会回收大量的对象图而不仅仅是需要什么.通过检查"select new"是否在正确的时间执行,我减少了一个查询,将数据库中的850 MB数据从数据库拉到1.3 MB!