C# 具有DI的AutoMapper:无法创建类型为的实例。。。使用ValueResolver时

C# 具有DI的AutoMapper:无法创建类型为的实例。。。使用ValueResolver时,c#,.net-core,automapper,C#,.net Core,Automapper,我有一个带有以下Nuget软件包的.NET Core 3.1API: 自动制版机(10.1.1) AutoMapper.Extensions.Microsoft.DependencyInjection(8.1.1) 我试图使用ValueResolver将一个值从实体映射到dto,但出现了一个异常: AutoMappingException:无法创建TestAutomapperResolver.Mapping.CustomResolver类型的实例 Startup.cs public void

我有一个带有以下Nuget软件包的.NET Core 3.1API:

  • 自动制版机(10.1.1)
  • AutoMapper.Extensions.Microsoft.DependencyInjection(8.1.1)
我试图使用ValueResolver将一个值从实体映射到dto,但出现了一个异常:

AutoMappingException:无法创建TestAutomapperResolver.Mapping.CustomResolver类型的实例

Startup.cs

public void配置服务(IServiceCollection服务)
{
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";
    }
}
公共类TestProfile:Profile
{
公共TestProfile()
{
CreateMap()
.FormMember(src=>src.PropertyToBeMappedByResolver,opts=>opts.MapFrom());
}
}
公共类CustomResolver:IValueResolver
{
公共字符串解析(TestEntity源、TestDto目标、string destMember、ResolutionContext上下文)
{
返回“使用解析器生成的字符串”;
}
}
执行
mapper.CreateMap(实体)时我收到了这个异常

顺便说一下,使用这个解析器作为
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();

@LucianBargaoanu我显然读过这篇文章。我遗漏了什么?不,我不认为你遗漏了什么。我真的觉得这应该是有效的,我不知道为什么。我下载了你的代码,可以确认错误。很明显,你的代码与文档中的示例完全不同,因此,如果你阅读了该页面,你为什么要编写该代码?为什么?:)@Lucianbargaonanu哪一部分不是那样的?你克隆了我的回购协议吗?AM DI软件包已经存在了。@LucianBargaoanu我知道,但它对我不起作用,我问为什么……我不确定,但如果测试通过了,那么你肯定做错了。好吧,现在我很困惑。这怎么不能回答这个问题呢?如果我取下你的样本并运行它,我会得到异常。如果我添加第二行,将CustomResolver注入DI,它将无误地转换对象。@LucianBargaoanu检查我的编辑。你是对的,但他没有调用你认为他调用的方法。