[英]No service for type X has been registered, but service registration looks ok?
我在ASP.NET Core 2.0 Web项目的Startup.cs中有一些非常简单的代码:
public async void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
await CreateContainer();
services.AddSingleton<Infrastructure.Logging.Contracts.ILogger, Infrastructure.Logging.Standard.Logger>();
}
private async Task CreateContainer()
{
string connectionString = Configuration["TestConnectionString"];
var storageAccount = CloudStorageAccount.Parse(connectionString);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference("logs");
await container.CreateIfNotExistsAsync();
}
在我的主页视图中,我有:
@using Infrastructure.Logging.Contracts
@inject ILogger logger
问题是应用程序崩溃(在视图中运行代码时)与:
An unhandled exception occurred while processing the request.
InvalidOperationException: No service for type 'Infrastructure.Logging.Contracts.ILogger' has been registered.
Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
Startup.cs中的所有代码均无例外地成功运行。
但是,如果我通过移动单行代码来更改ConfigureServices方法,如下所示:
public async void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddSingleton<Infrastructure.Logging.Contracts.ILogger, Infrastructure.Logging.Standard.Logger>();
await CreateContainer();
}
现在一切都成功运行,没有错误消息。
尝试注入已注册的类时,对CreateContainer方法的调用如何导致错误? 这些操作之间应该没有任何关系。
请注意,注册服务的调用在任何情况下都会成功运行,并且在调试器中,我可以通过检查服务对象来查看已注册服务的条目。 没有例外,这可以以某种方式改变执行流程。 我已进入调试器并检查了所有内容。
该问题是由在ConfigureServices方法内的async方法上调用await引起的。 我试图替换此行代码:
await CreateContainer();
与:
await Task.Delay(200);
问题仍然存在。
这是ConfigureServices方法的固定版本:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
CreateContainer().Wait();
services.AddSingleton<Infrastructure.Logging.Contracts.ILogger, Infrastructure.Logging.Standard.Logger>();
}
我不确定为什么会导致问题,但是它一定会在框架代码中引起某种同步问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.