.NET中如何将IConfiguration配置注入到Profile类中?
解决AutoMapper Profile中使用appsettings配置数组的问题
因为AutoMapper的Profile不支持带参数的构造函数,所以你不能直接在Profile的构造函数中注入IConfiguration。下面提供几种可行的解决方案:
方法一:自定义ValueResolver(推荐)
通过实现AutoMapper的IValueResolver接口,在Resolver中注入配置并处理映射逻辑,这是最符合AutoMapper设计规范的方式。
1. 创建自定义ValueResolver
public class XValueResolver : IValueResolver<Source, Destination, string> { private readonly string[] _settingsFilters; // 注入IConfiguration,解析appsettings中的数组 public XValueResolver(IConfiguration configuration) { _settingsFilters = configuration.GetSection("settingsArray").Get<string[]>(); } public string Resolve(Source source, Destination destination, string destMember, ResolutionContext context) { // 调用你的映射方法,传入数据源和配置数组 return MappingMethod(source.NestedSource, _settingsFilters); } // 你的核心映射逻辑 private string MappingMethod(object nestedSource, string[] filters) { // 示例逻辑:根据过滤器处理nestedSource if (nestedSource is string input && filters.Contains(input)) { return $"过滤后的结果:{input}"; } return input?.ToString() ?? string.Empty; } }
2. 修改Profile使用Resolver
public class MyProfile : Profile { public MyProfile() { CreateMap<Source, Destination>() .ForMember(dest => dest.X, opt => opt.MapFrom<XValueResolver>()); } }
如果是ASP.NET Core项目,AutoMapper会自动扫描并注册Resolver,无需额外配置;如果是其他项目,需要手动将Resolver注册到依赖注入容器。
方法二:映射时通过上下文传递参数
如果需要动态传递配置(比如不同场景用不同过滤器),可以在调用Map方法时通过上下文传递数组。
1. 调整Profile中的映射规则
public class MyProfile : Profile { public MyProfile() { CreateMap<Source, Destination>() .ForMember(dest => dest.X, opt => opt.MapFrom((src, _, __, context) => MappingMethod(src.NestedSource, (string[])context.Items["SettingsArray"]))); } private static string MappingMethod(object nestedSource, string[] filters) { // 你的映射逻辑实现 } }
2. 调用Map时传入参数
在需要执行映射的地方(比如控制器、服务):
public class MyService { private readonly IMapper _mapper; private readonly string[] _settingsArray; public MyService(IMapper mapper, IConfiguration configuration) { _mapper = mapper; _settingsArray = configuration.GetSection("settingsArray").Get<string[]>(); } public Destination MapToDestination(Source source) { // 通过Items传递配置数组 return _mapper.Map<Destination>(source, opt => opt.Items["SettingsArray"] = _settingsArray); } }
方法三:将映射逻辑封装到服务中
把MappingMethod放到一个依赖注入的服务里,在Profile中通过服务提供者获取这个服务并调用方法。
1. 创建映射服务
public class MappingLogicService { private readonly string[] _settingsFilters; public MappingLogicService(IConfiguration configuration) { _settingsFilters = configuration.GetSection("settingsArray").Get<string[]>(); } public string ProcessNestedSource(object nestedSource) { // 使用配置数组处理逻辑 // 示例: return nestedSource is string s && _settingsFilters.Contains(s) ? s : "未匹配过滤规则"; } }
2. 注册服务到DI容器
// 在Program.cs中 builder.Services.AddScoped<MappingLogicService>();
3. 修改Profile调用服务
public class MyProfile : Profile { public MyProfile() { CreateMap<Source, Destination>() .ForMember(dest => dest.X, opt => opt.MapFrom((src, _, __, context) => context.Mapper.ServiceProvider.GetService<MappingLogicService>().ProcessNestedSource(src.NestedSource))); } }
内容的提问来源于stack exchange,提问作者user18154574
相关产品推荐
相关产品推荐

