c# - AutoMapper 最佳实践——我应该向 DAO 询问信息以完成从 DTO 到域对象的映射吗?

标签 c# automapper

/// <summary>
///     Initialize the AutoMapper mappings for the solution.
///     http://automapper.codeplex.com/
/// </summary>
public static void CreateAutoMapperMaps()
{
    IDaoFactory daoFactory = DependencyResolver.Current.GetService<IDaoFactory>();

    Mapper.CreateMap<Error, ErrorDto>()
            .ReverseMap();

    IPlaylistDao playlistDao = daoFactory.GetPlaylistDao();
    IUserDao userDao = daoFactory.GetUserDao();

    Mapper.CreateMap<Playlist, PlaylistDto>();
    Mapper.CreateMap<PlaylistDto, Playlist>()
            .ForMember(playlist => playlist.User, opt => opt.MapFrom(playlistDto => userDao.Get(playlistDto.UserId)));

    Mapper.CreateMap<PlaylistItem, PlaylistItemDto>();
    Mapper.CreateMap<PlaylistItemDto, PlaylistItem>()
            .ForMember(playlistItem => playlistItem.Playlist,
                        opt => opt.MapFrom(playlistItemDto => playlistDao.Get(playlistItemDto.PlaylistId)));

    Mapper.CreateMap<ShareCode, ShareCodeDto>().ReverseMap();

    Mapper.CreateMap<User, UserDto>().ReverseMap();
    Mapper.CreateMap<Video, VideoDto>().ReverseMap();

    Mapper.AssertConfigurationIsValid();
}

一位 friend 告诉我,AutoMapper 依赖 DAO 来完成从 DTO 到域的映射是一种不好的做法。

我不明白为什么这是不好的做法,也不明白如何使用空引用有效地处理我的域对象。

谁能解释一下?谢谢

最佳答案

这主要是我根据我的经验和阅读得出的意见。其他人可能不同意。如果您坚持严格域实体与其他层的分离,那么使用 AutoMapper 来填充您的域实体 (DE) 将被认为是错误的。严格的 DE 设计通常不会以可设置的形式公开其属性。您的实体将小心翼翼地控制数据的设置方式,并在允许输入成为实体的一部分之前仔细验证以审查输入。这通常采取仅公开提供方法的形式。我觉得这对于关键系统和非常复杂的业务逻辑来说是一种有用的模式。

我对上述模型的问题是,在许多情况下,它是矫枉过正的,并且会导致域数据的副本过多。你真的想将从你的数据源加载的 DTO 映射到你的 DE,然后将另一个 DTO 从你的 DE 映射到你的 View 吗?痛苦,有更多的错误空间。

对于更小、更简单的系统,我认为使用良好的 ORM 解决方案将 DE 映射到数据存储更有意义,使用 Onion Architecture管理依赖关系,并将您的 DE 映射到适当的 View 模型。这是 AutoMapper 非常有用的地方。

关于c# - AutoMapper 最佳实践——我应该向 DAO 询问信息以完成从 DTO 到域对象的映射吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22138669/

相关文章:

c# - 从另一个类调用静态函数时如何修复 "Does not exist"?

C# 单管道语法

c# - 创建自定义按钮控件

带前导空格的 C# 格式货币?

c# - 如何告诉 Automapper 检查所有源属性是否都有目标属性

c# - Switch Case 根据用户的选择调用函数

c# - 有条件地将一种源类型映射到两种目标类型

c# - Automapper基类映射

automapper - 如何构建 AutoMapper 映射以在目标类构造函数中传递参数

c# - 使用 Automapper (C#) 将 JObject 转换为类的有效方法