繁体   English   中英

没有为X类型注册任何服务,但是服务注册看起来还可以吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM