私はいくつかの非常に単純なASP.NETコア2.0 WebプロジェクトでStartup.csのコード持っている:私のホーム・ページビューでタイプXのサービスは登録されていませんが、サービス登録はOKですか?
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メソッドを呼び出すとエラーが発生する可能性がありますか?これらの操作の間には何の関係もないはずです。
サービスを登録する呼び出しはどの場合でも正常に実行され、デバッガではサービスオブジェクトを調べて登録済みサービスのエントリを確認できます。何らかの形で実行の流れを変える可能性のある例外はありません。私はデバッガでステップを踏んで、すべてをチェックしました。
サービスを名前で登録していますか? "ログ?" – Zinov
ほとんどの場合、 'CreateContainer'操作には時間がかかります。 'ConfigureServices'メソッドは' CreateContainer'オペレーションを開始した直後に終了し、フレームワークは次の作業に移ります。そのうちの1つがあなたの意見を表示しています。したがって、ビューが表示されようとしているときに、CreateContainerがまだ実行されているため、サービスが登録されないことがあります。それを確認する最も簡単な方法は、 'await CreateContainer'の後にロギング(単に' Console.Write'でもかまいません)し、例外の前後に起こるかどうかを確認することです。後で(まったく起こらない) - この仮定が正しいことを意味します。 – Evk
サービスを登録するコードがコードスニペットに示されています。 – OlavT