具有对象和解析器对象的自动映射器

时间:2016-12-20 17:52:11

标签: c# .net entity-framework asp.net-mvc-5 automapper

我试图使用automapper将EF实体映射到MVC的模型视图。在使用旧的静态版本的automapper时,我在地图上找到了很多例子,但是在进行新的基于界面的时候,没有干净的切割示例是可用的。

我的结构UserLog对象具有ApplicationUser属性,UserLog应映射到UserLogsModel

在我的 App_start 文件夹中,我有一个

public static class AutoMapperConfig
{
    public static IMapper mapper;

    public static void RegisterMappings()
    {
        var config = new MapperConfiguration(cfg =>
        {
            cfg.CreateMap<UserLog, UserLogsModel>()
            .ForMember(d => d.Name, q => q.MapFrom(s => s.User.FirstName + " " + s.User.LastName))
            .ForMember(d => d.UserName, q => q.ResolveUsing<UserNameResolver>());
    });

        mapper = config.CreateMapper();
        var source = new UserLog();
        var dest = mapper.Map<UserLog, UserLogsModel>(source);

        var source2 = new List<UserLog>();
        var dest2 = mapper.Map<IEnumerable<UserLog>>(source2);



        config.AssertConfigurationIsValid();
    }

}

然后我在相同的文件夹和命名空间中也有UserNameResolver

public class UserNameResolver : IValueResolver<UserLog, UserLogsModel, string>
{
    public string Resolve(UserLog source, UserLogsModel d, string dest, ResolutionContext context)
    {
        return source.User.UserName;
    }
}

解析器不会工作。我甚至不知道为什么UserLogsModel需要成为解析器的一部分,因为它不会向解决方案添加任何内容。有什么建议我应该怎么写这个?看来我在这里遗漏了一些核心知识。我的猜测也是AutoMapperConfig不应该像它那样。

当我将initlization更改为static并用

替换Automapperconfig时
   Mapper.Initialize(cfg =>
        {
            cfg.CreateMap<UserLog, UserLogsModel>()
            .ForMember(d => d.Name, q => q.MapFrom(s => string.Join(" ", s.User.FirstName, s.User.LastName)))
            .ForMember(d => d.UserName, q => q.MapFrom(s => s.User.UserName))
            .ForMember(d => d.Email, q => q.MapFrom(s => s.User.Email));

        });

它有效,但仍然没有解析器

0 个答案:

没有答案