当我尝试解析 .net core 2.1 azure 函数应用程序中的服务时,我在本地看到以下间歇性异常。它似乎仅在该函数同时处理多个消息时才会发生,并且仅使某些消息失败。
'System.Private.CoreLib: Exception while executing function: FunctionOne. Microsoft.Extensions.DependencyInjection: Unable to resolve service for type 'Microsoft.Extensions.Configuration.IConfiguration' while attempting to activate 'XXX.Service2'.
当服务与函数位于同一项目中时,一切正常。只有当我将其移至另一个项目时才会发生这种情况。我创建的另一个项目只是一个简单的 .net 标准 2.0 项目,其中仅包含此服务以及对 Microsoft.Extensions.Configuration nuget 的引用。
我知道此实现使用了服务定位器,这是一种反模式,但我仍然想了解为什么会发生此异常。
[FunctionName("FunctionOne")]
public static void Run(
[QueueTrigger(_queue, Connection = _storageConnection)]
string queueItem,
ILogger trace)
{
// Startup
var services = Startup.GetServices();
// Services
var service = services.GetService<IService2>();
}
public static class Startup
{
public static Func<IServiceProvider> GetServices = CreateServices;
public static IConfiguration GetConfiguration()
{
return new ConfigurationBuilder()
.AddEnvironmentVariables()
.Build();
}
private static IServiceProvider CreateServices()
{
var services = new ServiceCollection();
var config = GetConfiguration();
services
.AddSingleton(config)
.AddSingleton<IService2, Service2>();
return services.BuildServiceProvider();
}
}
public class Service2 : IService2
{
public Service2(IConfiguration configuration)
{
}
}
public interface IService2
{
}
最佳答案
尝试将其作为 IConfigurationRoot 而不是 IConfiguration 注入(inject):
public HomeController(IConfigurationRoot configuration
, IService2 service)
{
_mailService = service;
_to = configuration["emailAddress.Support"];
}
在本例中,该行
services.AddSingleton(provider => Configuration);
相当于
services.AddSingleton<IConfigurationRoot>(provider => Configuration);
因为类上的配置属性是这样声明的,并且注入(inject)将通过匹配它注册的任何类型来完成。我们可以很容易地复制这个,这可能会让它更清楚:
试试这个,看看是否有帮助。
关于c# - 间歇性依赖注入(inject)失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55839514/