【问题标题】:design pattern to convert one DTO into another将一个 DTO 转换为另一个的设计模式
【发布时间】:2023-03-14 17:15:01
【问题描述】:

我是设计模式的新手,想知道将一个 DTO 转换为另一个 DTO 的最佳方法是什么。

为了最大限度地提高性能我使用存储过程来连接多个表(例如entriesdefinitionsexamplesvocabularies)并返回完整集超过 40 列的数据 - 重新创建复合 DTO 需要这些数据。

所以我最终拥有一个单独的 DTO (GetEntryDbDto),其中包含 40 多个字段,并且我手动将来自 DB 的响应映射到它。

第二个 DTO 是结构化的,因此它具有嵌套集合。

现在我将把一个 DTO 转换成另一个 DTO 的代码保存在 工厂中。

public class EntryFactory
{
    public static EntryDto Get(DbDataReader reader)
    {
        List<GetEntryDbDto> dbDtos = GetEntryDbDtoFactory.Get(reader);
        ...

        return entryDto;
    }
    ...

对象结构如下:

EntryDto 包含 Definitions - DefinitionDto[] 的集合。

每个DefinitionDto 都有Examples 集合-ExampleDto[]


我没有为上述两个类引入任何接口,因为它们不共享公共属性。

有没有更好的方法使用不同的设计模式来重构它?

【问题讨论】:

标签: c# design-patterns architecture refactoring software-design


【解决方案1】:

有些工具可以让编码变得更容易一些,例如 Automapper,但它们可能会出现性能问题。一般来说,从数据模型映射到域模型的模式是正确的方法。让存储过程将数据扁平化为单行似乎可以提供最佳性能。发出几个单独的查询来获取各个部分并在代码中组装它们会受到查询提交开销的影响。

【讨论】:

    【解决方案2】:

    如果你那么关心你的表现,那为什么还要用 C# 编写代码呢?明智地使用它并使用 C++。否则,除了现在的手动映射之外,您别无选择。没有像上面提到的Automapper 这样的框架足够快,可以超越手动解决方案。

    唯一值得了解的是泛型。例如,您可能有类似 public abstract TOutput Map() where TOutput : ModelBase 的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-10
      • 1970-01-01
      • 1970-01-01
      • 2017-05-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多