C# 使用存储库的对象映射器
我想知道在将DTO转换为其域对象对应项时使用存储库是否是一种糟糕的设计 我正在构建一个n层web应用程序,它有一个存储库层和一个服务层,以及用于ORM的ef4。服务层公开域对象的DTO版本。当我从服务的使用者接收到DTO时,服务将使用AutoMapper将DTO转换为域对象。现在,域对象上的一些成员属性需要从数据库中加载,例如,我有下面的类- DTO版本:C# 使用存储库的对象映射器,c#,repository,automapper,dto,C#,Repository,Automapper,Dto,我想知道在将DTO转换为其域对象对应项时使用存储库是否是一种糟糕的设计 我正在构建一个n层web应用程序,它有一个存储库层和一个服务层,以及用于ORM的ef4。服务层公开域对象的DTO版本。当我从服务的使用者接收到DTO时,服务将使用AutoMapper将DTO转换为域对象。现在,域对象上的一些成员属性需要从数据库中加载,例如,我有下面的类- DTO版本: public class LogonEventDto { public DateTime Time { ge
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;
}
}
域版本:
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/数据契约)分离。这样,您就不会公开任何内部构件,并且可以在不影响公共服务契约的情况下重构实现(假设映射仍然可行) 我们在SOA(-isch)客户项目中一直使用这种模式。我们甚至有一个工具来帮助您生成映射代码 我不喜欢AutoMapper(尽管代码很酷),因为它需要您在运行时指定映射(您必须编写代码来构建映射定义)。在我看来,映射定义是设计时的事情。这就是我们构建代码生成器工具的原因 根据我的经验,我遇到了以下问题:
- 不要单独获取每个记录的数据(按Id)。相反,在一次往返过程中(到数据库/数据源/其他web服务)组装一个要解析的ID列表,并让映射简单地执行对检索到的批的查找
- 对于包含大量对象的复杂映射以及源和目标之间不同的类层次结构,很难对映射内容、映射位置和映射方式进行概述。目前还没有真正的解决方案——除了构建一个工具来帮助您解决这个问题