首页 > 解决方案 > .NET Core 依赖注入在更新到版本 5.0.0 后给出“不明确的构造函数”错误

问题描述

我有许多使用 API 服务的类,其构造函数遵循以下模式:

public class SomeClass
{
    public SomeClass(IHttpClientFactory factory, ILogger<SomeClass> logger = null)
    {
        // ...
    }
        
    public SomeClass(HttpClient client, ILogger<SomeClass> logger = null)
    {
        // ...
    }
}

第一个构造函数是 .NET Core 内置依赖注入使用的构造函数(通过IServicesCollection.AddHttpClient()Startup.ConfigureServices()方法调用,然后IHttpClientFactory.CreateClient()在构造函数中调用);第二个构造函数主要用于单元测试,以允许HttpClient传入(或模拟)。这一直工作到现在,但今天早上我开始收到如下错误:

发生了未处理的异常

System.InvalidOperationException:无法激活类型“服务”。以下构造函数有歧义:Void .ctor(System.Net.Http.IHttpClientFactory, Microsoft.Extensions.Logging.ILogger`1[Service])Void .ctor(System.Net.Http.HttpClient, Microsoft.Extensions.Logging.ILogger `1[Service]) 在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateConstructorCallSite(ResultCache 生命周期,类型 serviceType,类型 implementationType,CallSiteChain callSiteChain)

...省略了长堆栈跟踪...

这一直工作到现在。看起来很奇怪,依赖注入机制认为构造函数在不共享任何公共接口IHttpClientFactory时是模棱两可的。HttpClient

我在周末将 Visual Studio 19 更新到了最新版本 (16.8.2) 和解决方案中的所有 NuGet 包。该Microsoft.Extensions.DependencyInjection软件包现在是 5.0.0 版;以前是 3.1.9 版。我现在已经通过删除接受HttpClient参数的构造函数并替换我的测试中的代码以使用模拟IHttpClientFactory来解决这个问题,因此实际影响很小。但是,如果不出意外的话,这将有助于我内心的平静,以了解为什么这首先会破裂。我忽略了配置 .NET Core 依赖注入的某些方面吗?或者解决依赖关系的策略在 3.1.9 和 5.0.0 版本之间是否发生了微妙的变化?

标签: .net-coredependency-injectionvisual-studio-2019

解决方案


推荐阅读