【问题标题】:Asp.net core 2.0 AutoMapper IValueResolver dependency injectionAsp.net core 2.0 AutoMapper IValueResolver 依赖注入
【发布时间】:2023-03-12 18:10:02
【问题描述】:

我已经尝试了 Google 结果、Stackoverflow 和 AutoMapper 中的大多数示例。但无法让 IValueResolverdependancy 注入工作。

我有以下服务

public class StorageService : IStorageService
{
    private readonly BlobServiceSettings _blobServiceSettings;

    public StorageService(IOptions<BlobServiceSettings> blobServiceSettings)
    {
        _blobServiceSettings = blobServiceSettings.Value;
    }

    // some methods I need
}

这是我的个人资料

public class MappingProfile : Profile
{
    public MappingProfile()
    {
        CreateMap<Building, BuildingEnvelope>(MemberList.None)
        .ForMember(dest => dest.ImageUrl, opt => opt.ResolveUsing<BuildingImageUrlResolver>());
    }
}

这是我的 IValueResolver

public class BuildingImageUrlResolver : IValueResolver<Building,         BuildingEnvelope, string>
{
    private readonly IStorageService _storageService;
    public BuildingImageUrlResolver(IStorageService storageService)
    {
        _storageService = storageService;
    }

    public string Resolve(Building entity, BuildingEnvelope envelope, string member, ResolutionContext context)
    {               
        return _storageService.MyMethod(entity.ImageFileName);
    }
}

我的内部异常出现以下错误

No parameterless constructor defined for this object.

不知道我做错了什么。

提前致谢 尼奥

【问题讨论】:

  • 错误是否标识了哪个类?无论如何,我怀疑您需要 public StorageService() 或 public BuildingImageUrlResolver()
  • @FRowe 只要我在构造函数中有一个 DI,我就会收到此错误

标签: dependency-injection automapper asp.net-core-2.0 resolver


【解决方案1】:

Lucian 的建议是正确的——AutoMapper.Extensions.Microsoft.DependencyInjection 包是要走的路。即使你不想使用它,你也必须做类似的事情。

我也遇到过同样的问题,通过使用扩展,您只需修改注册 AutoMapper 及其配置的入口点。

扩展程序 (source) 的作用是:

  1. 使用提供的配置初始化 Automapper
  2. 它会扫描所有可以使用依赖注入实现的类,并将它们注册为瞬态,寻找以下实现:

    • IValueResolver
    • IMemberValueResolver
    • ITypeConverter
    • IMappingAction

    它将扫描的程序集实际上取决于您在调用时提供的参数。

  3. 如果其中任何一个可以实际实例化,那么它们将被注册为临时实现。
  4. 就像这样,AutoMapper 会向服务提供商请求这些实例,服务提供商会解析它们,为此,它还会解析所有未决的依赖项。

请注意,这实际上非常简单——最困难的部分是扫描正确的程序集并注册正确的类。您也可以手动完成,但这些扩展已经为您处理好了。

请注意,即使反射已经得到很大改进,这个过程也相对缓慢,所以尽量不要滥用它(例如,在测试中)。


最后,如果这些都不适合您,请记住您还需要设置 AutoMapper 以使用依赖注入解析器:

automapperConfiguration.ConstructServicesUsing(serviceProvider.GetService);

【讨论】:

  • 抱歉延迟回来,是在假期和现在回来。我之前确实尝试过使用 AutoMapper.Extensions.Microsoft.DependencyInjection 并且是同样的问题,我想知道它是否与项目有关。 IStorageService 也有一个依赖注入,如下所示 public StorageService(IOptions blobServiceSettings) { _blobServiceSettings = blobServiceSettings.Value;不知道这是一个问题,可能会删除它并尝试,但我将无法永久删除它,因为服务在项目中被广泛使用。谢谢
  • 我尝试删除 IStorageService 中的 DI,但仍然出错。肯定是解析器 DI,还有什么想法吗?
  • @NeroIsNoHero 您是否尝试将参数传递给扩展方法以便扫描正确的程序集?
  • 嗨 Alpha 感谢您的重播,是的,我在 startup.cs [code]services.AddAutoMapper(typeof(IStorageService));[/code] 如果我在构造函数中放置断点“StorageService”它确实命中并且它确实解决了它的依赖关系(从应用程序设置中获取 URL)错误映射类型。映射类型:Building -> BuildingEnvelope Building -> BuildingEnvelope 类型映射配置:Building -> BuildingEnvelope Building -> BuildingEnvelope 属性:ImageUrl 任何想法,已经为此苦苦挣扎了几个月,能完成它会很棒。谢谢
  • 只要我从构造函数中删除 DI,就没有错误
猜你喜欢
  • 2018-03-23
  • 2016-09-13
  • 2018-03-03
  • 1970-01-01
  • 2011-05-11
  • 1970-01-01
  • 1970-01-01
  • 2018-01-16
  • 1970-01-01
相关资源
最近更新 更多