避免构造函数映射字段

时间:2018-02-14 14:59:52

标签: c# .net-core automapper

我正在使用带有.NET Core 2.0的AutoMapper 6.2.2及其默认的依赖注入机制来映射模型和DTO。 我在AutoMapper配置中需要DI,因为我必须执行AfterMap< Action>这需要一些注入的组件。 问题是,对于某些具有参数匹配某些源成员的构造函数的模型,当我为AutoMapper启用DI时(添加services.AddAutoMapper()),这些构造函数默认调用并输入数据,然后使用EF中断我的操作。 公共类UserDTO {     public string Name {get;组; }     public string Email {get;组; }     公共ICollection< RoleDTO>角色{得到;组; } } 公共类用户 {     public string Name {get;组; }     public string Email {get;组; }     public ICollection< RoleInUser> RoleInUsers {get; } = new List< RoleInUser>();     公共ICollection<角色>角色{得到; }     公共用户()     {         Roles = new JoinCollectionFacade< Role,User,RoleInUser>(this,RoleInUsers);     }     public User(字符串名称,字符串电子邮件,ICollection< Role>角色):this()     {         Roles.AddRange(角色);     } } public class UserProfile:Profile {     public UserProfile()     {         CreateMap< UserDTO,User>()             .ForMember(entity => entity.Roles,opt => opt.Ignore())             .AfterMap< SomeAction>();     } } 在上一个代码段中,将使用角色列表调用用户(名称,电子邮件,角色)。 我的映射器配置如下(注意DisableConstructorMapping()选项)     protected override MapperConfiguration CreateConfiguration()     {         var config = new MapperConfiguration(cfg =>         {             cfg.DisableConstructorMapping();             //在当前程序集中添加所有配置文件             cfg.AddProfiles(组件);         });         return config;     } 我的Startup设置了所有内容:         var mapperProvider = new MapperProvider();         services.AddSingleton< IMapper>(mapperProvider.GetMapper());         services.AddAutoMapper(mapperProvider.Assemblies); 修改配置文件以配置与ConstructUsing一起使用的ctor     public UserProfile()     {         CreateMap< UserDTO,User>()             .ForMember(entity => entity.Roles,opt => opt.Ignore())             .ConstructUsing(src => new User())             .AfterMap< SomeAction>();     } 它按预期工作,但这迫使我在每个Map配置中包含此样板语句, 而且模型很大。 如果没有依赖注入(这需要最近出现),它可以与第一个代码段(无需ConstructUsing)顺利运行。 我已经搜索过这个场景,但却找不到任何东西。是否将ConstructUsing添加到每个Map中?还有更好的选择吗?或者也许我正在做点什么 完全错了......

1 个答案:

答案 0 :(得分:1)

一年后,我在AutoMapper 8.0.0中遇到了这个问题。如果有人仍在遵循此方法,则有两种方法:

  1. 在每个ConstructUsing中添加CreateMap<Src, Des>
  2. 修改/添加到您的ConfigureServices这一行:services.AddAutoMapper(cfg => cfg.DisableConstructorMapping());

但是您必须在每个需要的类映射中创建一个空白构造函数。