依存性注入エラー: クラスが登録されているのに、アクティブ化を試みているときに型のサービスを解決できません 質問する

依存性注入エラー: クラスが登録されているのに、アクティブ化を試みているときに型のサービスを解決できません 質問する

.NET Core MVC アプリケーションを作成し、依存性注入とリポジトリ パターンを使用してコントローラーにリポジトリを注入しました。しかし、エラーが発生します:

InvalidOperationException: 'WebApplication1.Controllers.BlogController' をアクティブ化しようとしたときに、タイプ 'WebApplication1.Data.BloggerRepository' のサービスを解決できません。

リポジトリ:

public interface IBloggerRepository { ... }

public class BloggerRepository : IBloggerRepository { ... }

コントローラ:

public class BlogController : Controller
{
    private readonly IBloggerRepository _repository;

    public BlogController(BloggerRepository repository)
    {
        _repository = repository;
    }

    public IActionResult Index() { ... }
}

スタートアップ.cs:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    
    services.AddScoped<IBloggerRepository, BloggerRepository>();
}

何が間違っているのか分かりません。何かアイデアはありますか?

ベストアンサー1

エラー メッセージを分解するには:

'WebApplication1.Controllers.BlogController' をアクティブ化しようとしたときに、タイプ 'WebApplication1.Data.BloggerRepository' のサービスを解決できません。

これは、アプリケーションが のインスタンスを作成しようとしているが、コンストラクターに渡すのインスタンスを作成する方法BlogControllerがわからないことを意味します。BloggerRepository

次に、スタートアップを見てみましょう。

services.AddScoped<IBloggerRepository, BloggerRepository>();

IBloggerRepositoryつまり、 が必要なときはいつでも を作成してそれを渡すということですBloggerRepository

ただし、コントローラー クラスは具体的なクラスを要求しておりBloggerRepository、依存性注入コンテナーはそれを直接要求された場合に何をすべきかわかりません。

おそらくタイプミスだと思いますが、これはよくあるミスです。そのため、簡単な修正方法は、DI コンテナーが処理方法を知っているもの (この場合はインターフェイス) を受け入れるようにコントローラーを変更することです

public BlogController(IBloggerRepository repository)
//                    ^
//                    Add this!
{
    _repository = repository;
}

一部のオブジェクトには登録するための独自のカスタム方法があることに注意してください。これは外部の Nuget パッケージを使用する場合によくあることなので、それらのドキュメントを読むことをお勧めします。たとえば、次のようなメッセージが表示された場合:

タイプ 'Microsoft.AspNetCore.Http.IHttpContextAccessor' のサービスを解決できません...

次に、カスタム拡張メソッドそのライブラリによって提供されるものは次のとおりです。

services.AddHttpContextAccessor();

その他のパッケージについては、必ずドキュメントをお読みください。

おすすめ記事