在带有 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 时,您只有两种可能:
- 将 AutoMapper 作为附加参数提供给您的静态方法。
- 为所需的配置文件即时创建映射器。
虽然第一个是不言自明的,但第二个需要一个额外的辅助方法,这样更容易使用:
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);
但请注意,第二种方法非常繁重,根据调用方法的时间长短,您最好使用第一种方法。
我正处于一种情况,我正在从扩展方法 class 中的一个层转移一些逻辑。问题是我想在具有扩展方法的 Static class 中使用自动映射器。该项目在 .NET Core 上 运行,我无法在静态 class 中访问 AutoMapper,就像在控制器中一样 class 通常我们使用构造函数来注入 AutoMapper , 但静态 classes 没有构造函数。
有没有办法以任何方式在静态 class 中调用已在 Startup.cs
中配置的 AutoMapper 服务?
当您需要在静态方法中使用 AutoMapper 时,您只有两种可能:
- 将 AutoMapper 作为附加参数提供给您的静态方法。
- 为所需的配置文件即时创建映射器。
虽然第一个是不言自明的,但第二个需要一个额外的辅助方法,这样更容易使用:
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);
但请注意,第二种方法非常繁重,根据调用方法的时间长短,您最好使用第一种方法。