带有 DI 的 AutoMapper:无法创建类型的实例...使用 ValueResolver 时
AutoMapper with DI: Cannot create an instance of type... When using a ValueResolver
我有一个 .NET Core 3.1 API,其中包含以下 Nuget 包:
- AutoMapper (10.1.1)
- AutoMapper.Extensions.Microsoft.DependencyInjection (8.1.1)
我正在尝试使用 ValueResolver 将一个值从实体映射到 dto,但出现异常:
AutoMapperMappingException: Cannot create an instance of type TestAutomapperResolver.Mapping.CustomResolver
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddAutoMapper(cfg => cfg.AddMaps(typeof(TestProfile).Assembly));
}
TestProfile.cs
public class TestProfile : Profile
{
public TestProfile()
{
CreateMap<TestEntity, TestDto>()
.ForMember(src => src.PropertyToBeMappedByResolver, opts => opts.MapFrom<CustomResolver>());
}
}
public class CustomResolver : IValueResolver<TestEntity, TestDto, string>
{
public string Resolve(TestEntity source, TestDto destination, string destMember, ResolutionContext context)
{
return "String generated with resolver";
}
}
在执行 mapper.CreateMap<TestDto>(entity);
时我收到了那个异常。
顺便说一句,使用此解析器作为 opts => opts.MapFrom(CustomResolver())
不是一个选项,因为我想向该解析器注入一些服务。
有什么想法吗?
您在不该使用的时候使用了 AddMaps
。 AddMaps
仅添加配置文件和映射,但不添加 DI 包提供的所有额外服务。
这会正确地做到这一点:
services.AddAutoMapper(typeof(TestProfile).Assembly);
现在,AutoMapper 在这里给你一个非常无用的错误,但问题可以追溯到 Microsoft 依赖项注入。 DI 不知道您的自定义解析器类型,因此它甚至不会尝试。
由于您没有使用 DI 包的扩展方法,解析器不会添加到服务集合中。如果需要,您可以手动添加这些服务:
services.AddAutoMapper(cfg => cfg.AddMaps(typeof(TestProfile).Assembly));
services.AddTransient<CustomResolver>();
我有一个 .NET Core 3.1 API,其中包含以下 Nuget 包:
- AutoMapper (10.1.1)
- AutoMapper.Extensions.Microsoft.DependencyInjection (8.1.1)
我正在尝试使用 ValueResolver 将一个值从实体映射到 dto,但出现异常:
AutoMapperMappingException: Cannot create an instance of type TestAutomapperResolver.Mapping.CustomResolver
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddAutoMapper(cfg => cfg.AddMaps(typeof(TestProfile).Assembly));
}
TestProfile.cs
public class TestProfile : Profile
{
public TestProfile()
{
CreateMap<TestEntity, TestDto>()
.ForMember(src => src.PropertyToBeMappedByResolver, opts => opts.MapFrom<CustomResolver>());
}
}
public class CustomResolver : IValueResolver<TestEntity, TestDto, string>
{
public string Resolve(TestEntity source, TestDto destination, string destMember, ResolutionContext context)
{
return "String generated with resolver";
}
}
在执行 mapper.CreateMap<TestDto>(entity);
时我收到了那个异常。
顺便说一句,使用此解析器作为 opts => opts.MapFrom(CustomResolver())
不是一个选项,因为我想向该解析器注入一些服务。
有什么想法吗?
您在不该使用的时候使用了 AddMaps
。 AddMaps
仅添加配置文件和映射,但不添加 DI 包提供的所有额外服务。
这会正确地做到这一点:
services.AddAutoMapper(typeof(TestProfile).Assembly);
现在,AutoMapper 在这里给你一个非常无用的错误,但问题可以追溯到 Microsoft 依赖项注入。 DI 不知道您的自定义解析器类型,因此它甚至不会尝试。
由于您没有使用 DI 包的扩展方法,解析器不会添加到服务集合中。如果需要,您可以手动添加这些服务:
services.AddAutoMapper(cfg => cfg.AddMaps(typeof(TestProfile).Assembly));
services.AddTransient<CustomResolver>();