尝试在.net core 2.1天蓝色功能应用程序中解析服务时,我在本地看到以下间歇性异常。它似乎仅在函数同时处理多个消息时发生,并且仅使某些消息失败。
'System.Private.CoreLib:执行函数FunctionOne时发生异常。 Microsoft.Extensions.DependencyInjection:尝试激活“ XXX.Service2”时,无法解析类型为“ Microsoft.Extensions.Configuration.IConfiguration”的服务。
当服务与功能位于同一项目中时,则一切正常。只有当我将其移至另一个项目时,才会发生这种情况。我创建的另一个项目只是一个简单的.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
{
}
答案 0 :(得分:1)
尝试将其作为IConfigurationRoot而不是IConfiguration注入:
public HomeController(IConfigurationRoot configuration
, IService2 service)
{
_mailService = service;
_to = configuration["emailAddress.Support"];
}
在这种情况下,行
services.AddSingleton(provider => Configuration);
等同于
services.AddSingleton<IConfigurationRoot>(provider => Configuration);
因为类的Configuration属性是这样声明的,所以注入将通过匹配其注册为的任何类型来完成。我们可以很容易地复制它,这可能使它更清晰:
尝试一下,看看是否有帮助。
答案 1 :(得分:1)
它似乎是运行时版本2.0.12408.0引入的“功能”。 2.0.12382.0不会发生这种情况。