我使用。net 6和AutoMapper(11.0.1)使用自定义转换器将一种类型映射到另一种类型。注意我使用了DI
public class FromToTypeConverter : ITypeConverter<From, To>
{
public FromToTypeConverter(ILogger<FromToTypeConverter> logger, ISomeService someService)
{
// set private fields with injected logger and service...
}
public To Convert(From source, To destination, ResolutionContext context)
{
// mapping logic....
}
}
在我的configureservices中,我注册了如下所有内容:
services.AddScoped<ISomeService, SomeService>();
services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
我让我的映射告诉AutoMapper像这样使用我的转换器:
CreateMap<From, To>().ConvertUsing<FromToTypeConverter>();
如果我有一个From对象列表,我想映射到to对象,我做:
var toObjs = mapper.Map<IEnumerable<To>>(fromObjs);
我注意到AutoMapper为它在列表中转换的每个对象创建了我的类型转换器的一个新实例。
是否有可能告诉AutoMapper重用转换器实例?
我想我已经找到解决办法了。
如果我告诉AutoMapper像这样使用我的转换器:
CreateMap<From, To>().ConvertUsing<ITypeConverter<From, To>>();
并将自定义类型转换器注册到DI系统中,如:
services.AddScoped<ITypeConverter<From, To>, FromToTypeConverter>();
那么它只为我的作用域创建一个实例。