在带有 C# 的 .NET Core 3 中的静态 class 中使用 AutoMapper

Using AutoMapper inside a static class in .NET Core 3 with C#

我正处于一种情况,我正在从扩展方法 class 中的一个层转移一些逻辑。问题是我想在具有扩展方法的 Static class 中使用自动映射器。该项目在 .NET Core 上 运行,我无法在静态 class 中访问 AutoMapper,就像在控制器中一样 class 通常我们使用构造函数来注入 AutoMapper , 但静态 classes 没有构造函数。

有没有办法以任何方式在静态 class 中调用已在 Startup.cs 中配置的 AutoMapper 服务?

当您需要在静态方法中使用 AutoMapper 时,您只有两种可能:

  1. 将 AutoMapper 作为附加参数提供给您的静态方法。
  2. 为所需的配置文件即时创建映射器。

虽然第一个是不言自明的,但第二个需要一个额外的辅助方法,这样更容易使用:

using System;

namespace AutoMapper
{
    public static class WithProfile<TProfile> where TProfile : Profile, new()
    {
        private static readonly Lazy<IMapper> MapperFactory = new Lazy<IMapper>(() =>
        {
            var mapperConfig = new MapperConfiguration(config => config.AddProfile<TProfile>());
            return new Mapper(mapperConfig, ServiceCtor ?? mapperConfig.ServiceCtor);
        });

        public static IMapper Mapper => MapperFactory.Value;

        public static Func<Type, object> ServiceCtor { get; set; }

        public static TDestination Map<TDestination>(object source)
        {
            return Mapper.Map<TDestination>(source);
        }
    }
}

有了这个,你就得到了一个静态方法,可以按如下方式使用:

var dest = WithProfile<MyProfile>.Map<Destination>(source);

但请注意,第二种方法非常繁重,根据调用方法的时间长短,您最好使用第一种方法。