如何跨 Visual Studio 个项目初始化自动映射器

how to initialize automapper accross Visual Studio Projects

我在 Visual Studio ASP.NET MVC 应用程序的多个 dll 项目中使用 automapper。我在主 WebUI 项目的 Application_Start() 方法中调用的每个项目中都创建了一个 AutoMapperConfiguration class。

问题是我正在尝试以相同的方式为我的 Visual Studio 解决方案的每个单独项目初始化自动映射器,但我收到一条错误消息,说自动映射器只能初始化一次...

如果我只为一个 ddl 项目而不是为多个 dll 项目执行初始化 automapper 的方式,我还会收到一条警告,在 8.1.1 版的 automapper 中说 Mapper.Initialize 方法被折旧。在版本 9.0.0 中,初始化方法不再存在...

我怎样才能做到这一点?

感谢您的帮助,

E.

我在每个dll项目中都有这段代码:

public class AutoMapperConfiguration
    {
        public static void ConfigureAutoMapper()
        {
            Mapper.Initialize(cfg =>
            {
                cfg.AddProfile<BusinessToDomainProfile>();
                cfg.AddProfile<DomainToBusinessProfile>();
            });
        }
    }

我在 Global.asax Appplication_Start 方法中将它称为我的主要 WebUI 项目:

   Domain.Mappers.AutoMapperConfiguration.ConfigureAutoMapper(); 
   Business.Mappers.AutoMapperConfiguration.ConfigureAutoMapper(); 

您只能初始化映射器一次。通常你在 'Set as StartUp Project' 中初始化,所以在你的情况下,收集所有这些 cfg.AddProfile() 并将它们放入你的 global.asax.cs Application_Start Initialize() 调用中。

我正在使用 Global.asax.cs Application_Start() 方法开发较旧的应用程序,该方法从一系列项目中配置 AutoMapper 配置文件,如下所示:

Mapper.AddProfile<AutoMapperConfigurationApi>();
Mapper.AddProfile<AutoMapperConfiguration>();
Mapper.AddProfile<AutoMapperWebConfiguration>();

每个配置文件,例如AutoMapperConfigurationApi 是另一个项目中的独立配置 class:

namespace API_MVC
{
    public class AutoMapperConfigurationApi : Profile
    {
        protected override void Configure()
        {
            CreateMap<EnquiryCreateRequest, EnquiryDto>();

        }
    }
}

我还有一个才几个月大的 .Net Core 3 应用程序,我正在使用:

在我的 Startup.cs MVC 项目中:

public void ConfigureServices(IServiceCollection services)
{
     ...

     services.AddAutoMapper(new Assembly[] {
              typeof(SomeProject.AutoMapperProfile).Assembly,
              typeof(SomeOtherProject.AutoMapperProfile).Assembly
            });
     ...
}

AutoMapperProfile.cs 个文件设置如下:

public class AutoMapperProfile : Profile
{
    public AutoMapperProfile()
    {
        CreateMap<MyModel, MyModelDto>();
    }
}

我在控制器中为 Mapper 使用依赖注入,例如:

public MyController
{
    public MyController(IMapper mapper)
    {

    }
}

将您的配置文件 classes 放入您的不同项目中,并在您的 ASP.NET MVC 项目中初始化一次 AutoMapper。

// Load all profiles in an assembly by specifying a type from the assembly
Mapper.Initialize(cfg => {
    cfg.AddProfiles(typeof(Student), typeof(Course));
});

不要在任何 class 库项目 (dll) 中调用 Mapper.Initialize。可执行文件(Web 应用程序、控制台应用程序等)负责初始化。