【问题标题】:AutoMapper with DI: Cannot create an instance of type... When using a ValueResolver带 DI 的 AutoMapper:无法创建类型的实例...使用 ValueResolver 时
【发布时间】:2021-05-25 14:21:28
【问题描述】:

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

  • AutoMapper (10.1.1)
  • AutoMapper.Extensions.Microsoft.DependencyInjection (8.1.1)

我正在尝试使用 ValueResolver 将值从实体映射到 dto,但出现异常:

AutoMapperMappingException:无法创建 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&lt;TestDto&gt;(entity); 时,我收到了该异常。

顺便说一句,将这个解析器用作opts =&gt; opts.MapFrom(CustomResolver()) 不是一个选项,因为我想将一些服务注入到那个解析器中。

有什么想法吗?

【问题讨论】:

  • @LucianBargaoanu 我显然读过这个。我错过了什么?
  • 不,我不认为你缺少任何东西。真的感觉这应该有效,我不知道为什么。我把你的代码记下来了,可以确认错误。
  • 显然您的代码与文档中的示例完全不同,所以如果您阅读了该页面,您是如何编写该代码的?为什么? :)
  • @LucianBargaoanu 哪一部分不是那样的?你克隆了我的仓库吗?

标签: c# .net-core automapper


【解决方案1】:

你不应该使用AddMapsAddMaps 只是添加配置文件和映射,但没有添加 DI 包所做的所有额外服务。

这将正确地完成:

services.AddAutoMapper(typeof(TestProfile).Assembly);

现在,AutoMapper 在这里给您一个非常无用的错误,但问题又回到了 Microsoft 依赖注入。 DI 不知道您的自定义解析器类型,因此它甚至不会尝试。

由于您没有使用 DI 包的扩展方法,因此解析器不会添加到服务集合中。如果需要,您可以手动添加这些服务:

services.AddAutoMapper(cfg => cfg.AddMaps(typeof(TestProfile).Assembly));
services.AddTransient<CustomResolver>();

【讨论】:

  • AM DI 包does that 已经。
  • @LucianBargaoanu 我知道,但它对我不起作用,我在问为什么......
  • 我不确定,但如果测试通过了,那么你一定做错了。
  • 好吧,我现在很困惑。这怎么不回答这个问题?如果我拿你的样本并运行它,我会得到例外。如果我添加第二行,将 CustomResolver 注入 DI,它会转换对象而不会出错。
  • @LucianBargaoanu 检查我的编辑。你是对的,但他没有调用你认为他调用的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-25
  • 2020-02-02
  • 2021-11-15
  • 2021-10-01
  • 1970-01-01
  • 2019-07-24
  • 2020-07-17
相关资源
最近更新 更多