0

我有一个非常简单的问题......是否可以像这样设置 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.Map 方法的任何调用,并且如果您使用 ProjectTo 或 UseAsDataSource 扩展方法,请确保传入适当的 IConfigurationProvider实例。

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

谢谢,

大卫

4

2 回答 2

0

我通常通过使用profile选项automapperhas 来完成此操作。如果既提供了灵活性,又提供了更少的修改空间——

Profile定义,通过从AutoMapper Profile类派生完成 -

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

于 2017-01-17T02:05:54.547 回答
0

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

全球.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();
}
于 2017-01-17T01:15:12.603 回答