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

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

我想知道在将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;
    }
}
域版本:

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列表,并让映射简单地执行对检索到的批的查找
  • 对于包含大量对象的复杂映射以及源和目标之间不同的类层次结构,很难对映射内容、映射位置和映射方式进行概述。目前还没有真正的解决方案——除了构建一个工具来帮助您解决这个问题
希望能有帮助。 Grtx,马克