AutoMapper 5.2如何配置

时间:2017-02-28 11:59:54

标签: c# automapper

配置AutoMapper以供全局使用的正确方法是什么。

我想设置一次,然后在应用程序中使用。

我有一种强烈的感觉,这是错误的。 事实上我知道这是错误的,因为这会调用一个新实例。 我想要一个全局配置然后你怎么称呼它。 找不到一个好例子!

这就是我所拥有的:但它不是我想要的

dat <- data.frame(n = seq(1, 19, by = 1),
des = c("Some very long text", "Some very lang test", "Some vary long text", "Some veri long text", "Another very long text", "Anather very long text", "Another very long text", "Different text", "Diferent text", "More text", "More test", "Much more text", "Muh more text", "Some other long text", "Some otoher long text", "Some more text", "Same more text", "New text", "New texd"))

dat <- dat[!duplicated(dat[,c('des')]),]

column <- which(names(dat) == "des")
dupli <- rep(FALSE, nrow(dat))
for (lin in 1:(nrow(dat)-1)){
  for (other in (lin+1):nrow(dat))
  {
    if (stringdist( dat[lin, column], dat[other, column]) < 2)  
       dupli[lin] <- TRUE       
  }         
}

然后用法:

public static class AutoMapperConfig
{
      public static IMapper GetMapper()
      {
          var config = new MapperConfiguration(cfg => {
              cfg.CreateMap<R_Logo, LogoDto>();
              //lots more maps...?
          });

          IMapper mapper = config.CreateMapper();
          return mapper;
      }
}

更新基于:pinkfloydx33

调用一次,然后完成配置。

  var imapper = AutoMapperConfig.GetMapper();
  var dest = imapper.Map<R_Logo, LogoDto>(logo);

5 个答案:

答案 0 :(得分:13)

以下是在asp.net core mvc中配置automapper的步骤。

1。创建从Profile

延伸的映射配置文件类
 public class ClientMappingProfile : Profile
 {
     public ClientMappingProfile ()
     {
         CreateMap<R_Logo, LogoDto>().ReverseMap();
     }
 }

2。创建AutoMapper配置类并在此处添加映射配置文件类。

public class AutoMapperConfiguration
{
   public MapperConfiguration Configure()
   {
        var config = new MapperConfiguration(cfg =>
        {
            cfg.AddProfile<ClientMappingProfile>();
        });
        return config;
    }
}

3. 我们如何使用它。

       var config = new AutoMapperConfiguration().Configure();
       var iMapper = config.CreateMapper();

       var dest = iMapper.Map<R_Logo, LogoDto>(logo);

答案 1 :(得分:10)

  

在StartupConfig或StartUp文件中设置它。

SET [GLOBAL | SESSION] group_concat_max_len = val;
  

映射的配置,

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
       // Web API configuration and services    
        .....

        MappingDTOModelToModel.Configure();
    }
}
  

在方法中调用它,

public static class MappingDTOModelToModel
{       
     private static void Configure()
     {
         Mapper.Initialize(cfg =>
         {
             cfg.CreateMap<R_Logo, LogoDto>()
                 .ForMember(x => x.ID,
                            m => m.MapFrom(a => a.ID))
                 .ForMember(x => x.FirstName,
                            m => m.MapFrom(a => a.FirstName)).ReverseMap();                    
         }
     }
 }

希望这有帮助,

答案 2 :(得分:6)

您可以按照here概述使用静态映射器api。

例如,在应用程序的某个地方,可能在启动期间,您将使用以下内容配置静态(全局)映射器:

AutoMapper.Mapper.Initialize(cfg => { 
   cfg.CreateMap<Type1, Type2>(); 
   /* etc */
});

然后,只要您需要使用“全局”配置的映射器,就可以通过静态Mapper属性(IMapper)访问它:

Type1 objectOfType1 = new Type1();
var result = AutoMapper.Mapper.Map<Type2>(objectOfType1);

然后,您可以为应用程序持续时间内提供的所有类型/配置/配置文件配置一个映射器,而无需配置单个映射器实例。

简而言之,您只需配置一次(可能是在应用程序启动时)。然后,静态映射器实例(IMapper)可通过AutoMapper.Mapper访问整个应用程序的任何位置。

通过此静态属性进行访问是您在评论中称为“全局”的内容。您需要的任何地方只需使用AutoMapper.Mapper.Map(...),只要您先拨打Initialize

请注意,如果您在静态实例上多次调用Initialize,则每个后续调用都会覆盖现有配置。

警告 在以前版本的AutoMapper中,静态映射器已被删除。它后来被添加回来,我不知道他们是否保证它将保留在未来的版本中。建议使用您自己配置的映射器实例。如果需要,可以将它存储在某个静态属性中。否则,您可以查看配置文件等,以便轻松配置您的映射器,以便拥有自己的实例不一定是“麻烦”。

答案 3 :(得分:1)

我们对这个问题的解决方案是首先创建一个可以将类装饰为&#34; Mappable&#34; (To,From或Both)。然后,您可以在一个位置初始化AutoMapper,通常是在应用程序初始化之后,并使用Reflection为装饰类的每个实例动态创建一个映射。

以下是一个例子:

var types = _myTypeFinder.Find(type =>
    type.IsDefined(typeof(AutoMapperAttribute)) ||
    type.IsDefined(typeof(AutoMapperFromAttribute)) ||
    type.IsDefined(typeof(AutoMapperToAttribute))
    );

Mapper.Initialize(cfg =>
{
    foreach (var type in types)
    {
        AutoMapperHelper.CreateMap(type, cfg);
    }
});

答案 4 :(得分:0)

我为.Net Core中的配置自动映射器找到了最佳解决方案。 多个个人资料。 只需使用此:

services.AddSingleton(provider => new MapperConfiguration(cfg =>
    {
        cfg.AddProfile(new sampleProfileMapper());
    }).CreateMapper());