我想知道在将 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/