在ASP.NET MVC应用程序中的Global.asax级别配置最新版本的AutoMapper

本文关键字:配置 最新版 AutoMapper 新版本 asax Global NET ASP MVC 应用程序 | 更新日期: 2023-09-27 17:59:23

我正试图弄清楚如何在Global.asax级别配置新的AutoMapper。

我曾经用旧的AutoMapper做过以下操作:

在App_Start文件夹中创建一个名为MappingProfile.cs的类,在构造函数中我会添加这样的映射:

public MappingProfile()
{
     Mapper.CreateMap<Product, ProductDto>();
     Mapper.CreateMap<ApplicationUser, UserDto>();
}

然后在Global.asax中调用:

Mapper.Initialize(cfg => cfg.AddProfile<MappingProfile>());

有人能告诉我如何使用新版本的AutoMapper实现上述目标吗?我一直在看文件,但似乎看不懂。

我相信我在MappingProfile.cs文件中做了类似的操作:

    var config = new MapperConfiguration(cfg =>
    {
       cfg.CreateMap<Product, ProductDto>();
       cfg.CreateMap<ApplicationUser, UserDto>();
    });

但是我该如何处理config变量呢?

在ASP.NET MVC应用程序中的Global.asax级别配置最新版本的AutoMapper

我就是这么做的。

public abstract class AutoMapperBase
{
    protected readonly IMapper _mapper;
    protected AutoMapperBase()
    {
        var config = new MapperConfiguration(x =>
        {
            x.CreateMap<Product, ProductDto>();
            x.CreateMap<ApplicationUser, UserDto>();
        });
        _mapper = config.CreateMapper();
    }
}

然后从任何需要使用它的类继承AutoMapperBase,并像这样调用它:

var foo = _mapper.Map<ProductDto>(someProduct);

您不再需要在Global.asax 中声明或配置它

您需要做的是:

Mapper.Initialize(cfg =>
{
    cfg.CreateMissingTypeMaps = true;
    cfg.AddProfile<MappingProfile>();
});

这将配置在旧的AutoMapper中公开的静态映射器实例,以便您可以执行以下操作:

Mapper.Map<SomeType>(fromObject);

如果您不想使用静态实例,那么您需要查看IntoNET的答案。

"CreateMissingTypeMaps"行确保"动态"创建丢失的映射。它相当于旧的:

Mapper.DynamicMap<SomeType>(fromObject)

如果要手动定义每个映射,可以删除这一行。

有一个版本的AutoMapper,作者出于某种原因试图摆脱暴露的静态,但在我所了解的公众强烈抗议后,他又把它带了回来。所以现在你可以用任何你觉得合适的方式来做。你可以在这里阅读:

https://lostechies.com/jimmybogard/2016/02/24/automapper-4-2-1-released-static-is-back-limited-edition/