.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();
その他のパッケージについては、必ずドキュメントをお読みください。