是否可以使用新的MapperConfiguration方法?

时间:2017-01-17 00:46:29

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

我有一个非常简单的问题...... 是否可以像这样设置AutoMapper:

public IMapper Init()
{
     var config = new MapperConfiguration(cfg =>
     {
         cfg = MappingModelsToViewModels(cfg);
      });

      return config.CreateMapper();
}

我将每个映射分成这样的方法:

 public IMapperConfigurationExpression MappingModelsToViewModels(IMapperConfigurationExpression cfg)
 {
     cfg = SKU(cfg);
     cfg = Lot(cfg);
     cfg = SalesRate(cfg);
     cfg = SpecialSalesRate(cfg);
     cfg = Order(cfg);
     //...

     return cfg;
}

        public IMapperConfigurationExpression SKU(IMapperConfigurationExpression cfg)
        {
               // HTTPGET
               cfg.CreateMap<SKU, SKUViewModel>() //...
               return cfg; 
        }

我问,因为我收到了这个错误:

  

Mapper未初始化。使用适当的方式调用Initialize   组态。如果您尝试通过a使用映射器实例   容器或其他,请确保您没有任何电话   静态Mapper.Map方法,如果您正在使用ProjectTo或   UseAsDataSource扩展方法,请确保传入   适当的IConfigurationProvider实例。

我通过将部分映射代码移动到新的MapperConfiguration进行了测试,并且它正在运行。

谢谢,

大卫

2 个答案:

答案 0 :(得分:0)

有很多方法可以配置AutoMapper。我个人喜欢以下方法 -

Global.ascx.cs

protected void Application_Start()
{   
    ...
    AutoMapperConfiguration.Initialize();
    ...
}

AutoMapperConfiguration.cs

public static class AutoMapperConfiguration
{
    public static void Initialize()
    {
        MapperConfiguration = new MapperConfiguration(cfg =>
        {
            cfg.CreateMap<SKU, SKUViewModel>();
            cfg.CreateMap<SKUViewModel, SKU>();

            cfg.CreateMap<Lot, LotViewModel>();
            cfg.CreateMap<LotViewModel, Lot>();
        });
        Mapper = MapperConfiguration.CreateMapper();
    }

    public static IMapper Mapper { get; private set; }

    public static MapperConfiguration MapperConfiguration { get; private set; }
}

用法

用法就像 -

SKUViewModel model = AutoMapperConfiguration.Mapper.Map<SKU, SKUViewModel>(sku);

单元测试

[Test]
public void AutoMapperConfigurationInitializeValid()
{
   AutoMapperConfiguration.Initialize();
   AutoMapperConfiguration.MapperConfiguration.AssertConfigurationIsValid();
}

答案 1 :(得分:0)

我通常使用profile选项automapper来完成此操作。如果同时具有灵活性和较少的地方可以修改 -

个人资料定义,来自AutoMapper Profile class-

public class Profile1 : Profile 
{
    public Profile1(){ //... for version < 5, use protected void Configure
         CreateMap<SKU, SKUModel>()
         //........
    }
}

然后初始化自动播放器和加载配置文件 -

MapperConfiguration = new MapperConfiguration(cfg =>
{
    cfg.AddProfile<Profile1>();
});
Mapper = MapperConfiguration.CreateMapper();

或者您可以让AutoMapper自行检测个人资料 -

// Assembly objects
Mapper.Initialize(cfg => cfg.AddProfiles(/*.... supply the assembly here ...*/));

更多信息可以在这里找到 -

https://github.com/AutoMapper/AutoMapper/wiki/Configuration#profile-instances