【问题标题】:Object Mapper using repositories使用存储库的对象映射器
【发布时间】:2011-01-28 09:49:10
【问题描述】:

我想知道在将 DTO 转换为对应的域对象时使用存储库是否是一个糟糕的设计。

我正在构建一个 n 层 Web 应用程序,它具有存储库层和服务层以及用于 ORM 的 ef4。服务层公开域对象的 DTO 版本。当我从服务的消费者那里收到 DTO 时,服务将使用 AutoMapper 将 DTO 转换为域对象。现在,需要从数据库中加载域对象上的一些成员属性,例如我有下面的类 -

DTO 版本:

public class LogonEventDto
{
    public DateTime Time
    {
        get;
        set;
    }

    public Guid UserId
    {
        get;
        set;
    }
}

域版本:

public class LogonEvent
{
    public DateTime Time
    {
        get;
        set;
    }

    public User User
    {
        get;
        set;
    }
}

现在,在将 DTO 转换为 DO 版本时,我需要调用 UserRepository 上的 GetById() 方法并使用结果设置 LogonEvent.User 属性。

只是告诉你,我目前正在手动完成服务层中的所有转换逻辑。

所以正如我上面所问的,这是一个糟糕的设计决定吗?如果是,为什么?

【问题讨论】:

    标签: c# repository automapper dto


    【解决方案1】:

    我认为这样做是常识。您将内部状态表示(域模型)与服务合同(dto/数据合同)分离。这样您就不会暴露任何内部结构,并且您可以在不影响公共服务合同的情况下重构您的实现(假设映射仍然是可能的)。

    我们在 SOA(-isch) 客户项目中一直使用这种模式。我们甚至有一个工具可以帮助您生成映射代码。

    我不是 AutoMapper 的粉丝(尽管代码非常酷),因为它需要您在运行时指定映射(您必须编写代码来构建映射定义)。在我看来,映射定义是设计时的事情。这就是我们构建代码生成器工具的原因。

    根据我的经验,我遇到过以下情况:

    • 不要单独获取每条记录的数据(按 ID)。而是组装一个您想要在一次往返中解析的 Id 列表(到数据库/数据源/其他 Web 服务),并让映射简单地执行对检索到的批次的查找。
    • 由于具有大量对象的复杂映射以及源和目标之间的不同类层次结构,因此很难对映射的内容、映射的位置和方式进行概览。目前还没有真正的解决方案 - 除了构建一个可以帮助您解决问题的工具。

    希望对您有所帮助。 Grtx,马克

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-05
      相关资源
      最近更新 更多