c# - 使用存储库的对象映射器

标签 c# repository automapper dto

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

我正在构建一个 n 层网络应用程序,它具有存储库层和服务层以及用于 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 属性。

只是让你知道,我目前正在手动执行服务层中的所有转换逻辑。

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

最佳答案

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

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

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

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

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

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

关于c# - 使用存储库的对象映射器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4826804/

相关文章:

git - GitHub.com 的存储库大小限制

c# - LINQ 使用 Automapper 作为第三级属性

c# - 静态只读变量初始化

git - 与使用 Github 的人共享一个 git repo 分支的好方法是什么?

c# - 引用参数的 IL 差异

datetime - Delphi:格式化日期时间,不带午夜时间部分

c# - 当字符串为空时,C# Automapper 如何将字段设置为 null

c# - 如何在 Automapper 6 映射期间忽略所有源成员的空值?

c# - 播放前延迟音频

c# - WCF - 发布 JSON 对象