如何结合构造函数参数使用IMemberValueResolver
如何结合构造函数参数使用IMemberValueResolver
嘿,我来帮你理清这个问题!从你给出的代码来看,你已经在使用IMemberValueResolver处理字段映射了,但现在需要给这个Resolver添加构造函数参数对吧?其实很简单,主要有两种常用方式,我给你一步步讲清楚:
1. 先定义带构造函数的Resolver
首先,我们得修改你的CustomResolver,给它加上需要的构造函数参数。比如假设你需要传入一个税率来计算总额,代码可以写成这样:
public class CustomResolver : IMemberValueResolver<object, object, decimal, decimal> { // 保存构造函数传入的参数 private readonly decimal _taxRate; // 带参数的构造函数 public CustomResolver(decimal taxRate) { _taxRate = taxRate; } public decimal Resolve(object source, object destination, decimal sourceMember, decimal destMember, ResolutionContext context) { // 这里就可以用构造函数传入的参数来处理逻辑了 return sourceMember * (1 + _taxRate); } }
2. 方式一:直接实例化Resolver并传入参数
如果你的项目没有用依赖注入,或者只是简单场景,直接手动创建Resolver实例并传入构造函数参数就行,然后在映射配置里使用这个实例:
Mapper.Initialize(cfg => { // 创建Resolver实例时传入构造函数参数(比如8%的税率) var taxResolver = new CustomResolver(0.08m); cfg.CreateMap<Source, Destination>() // 直接使用我们创建好的Resolver实例 .ForMember(dest => dest.Total, opt => opt.ResolveUsing(taxResolver, src => src.SubTotal)); cfg.CreateMap<OtherSource, OtherDest>() .ForMember(dest => dest.OtherTotal, opt => opt.ResolveUsing(taxResolver, src => src.OtherSubTotal)); });
这种方式的好处是直观,适合简单场景;如果不同的映射需要不同的参数,只需要创建多个Resolver实例就行。
3. 方式二:结合依赖注入使用(适合ASP.NET Core等场景)
如果你的项目用了依赖注入(比如ASP.NET Core),可以把Resolver注册到DI容器里,让AutoMapper自动帮你解析实例,这样更符合依赖注入的设计思想:
第一步:注册Resolver到DI容器
在Program.cs或者Startup.cs里,注册你的CustomResolver,同时传入构造函数参数:
// 注册带构造函数参数的Resolver builder.Services.AddScoped<CustomResolver>(sp => new CustomResolver(0.08m)); // 注册AutoMapper builder.Services.AddAutoMapper(typeof(YourMappingProfile));
第二步:在Mapping Profile中使用Resolver
然后创建一个Mapping Profile类(推荐用这种方式替代直接调用Mapper.Initialize),直接指定Resolver的类型,AutoMapper会自动从DI容器中获取实例:
public class YourMappingProfile : Profile { public YourMappingProfile() { CreateMap<Source, Destination>() .ForMember(dest => dest.Total, opt => opt.ResolveUsing<CustomResolver, decimal>(src => src.SubTotal)); CreateMap<OtherSource, OtherDest>() .ForMember(dest => dest.OtherTotal, opt => opt.ResolveUsing<CustomResolver, decimal>(src => src.OtherSubTotal)); } }
这种方式的好处是解耦,Resolver的生命周期由DI容器管理,适合复杂项目。
小提示
如果不同的映射需要不同的构造函数参数,你可以:
- 创建多个Resolver子类(比如
EightPercentTaxResolver、TenPercentTaxResolver),各自带不同的参数; - 或者把参数放到
ResolutionContext中传递(不过这种方式更适合临时上下文参数,不是全局配置的参数)。
内容的提问来源于stack exchange,提问作者sensei
相关产品推荐
相关产品推荐

