AutoMapper最佳实践 - 我是否应该向DAO询问有关实现从DTO到域对象的映射的信息?

Sea*_*son 5 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();
}
Run Code Online (Sandbox Code Playgroud)

一位朋友告诉我,AutoMapper依靠DAO实现从DTO到域的映射是不好的做法.

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

谁能解释一下?谢谢

Vet*_*der 3

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

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

对于更小、更简单的系统,我认为更有意义的做法是使用良好的 ORM 解决方案将 DE 映射到数据存储,使用洋葱架构来管理依赖关系,并将 DE 映射到适当的视图模型。这就是 AutoMapper 非常有用的地方。