[解決済み】ASP.NET Core Dependency Injectionのエラーです。アクティブ化しようとしているときに、タイプのサービスを解決できません。
質問
.NET Core MVCアプリケーションを作成し、Dependency InjectionとRepositoryパターンを使用して、コントローラにリポジトリを注入しています。しかし、エラーが発生します。
InvalidOperationException: WebApplication1.Controllers.BlogController' をアクティブにしようとしているときに、タイプ 'WebApplication1.Data.BloggerRepository' のサービスを解決できません。
モデル (Blog.cs)
namespace WebApplication1.Models
{
public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
}
}
DbContext (BloggingContext.cs)
using Microsoft.EntityFrameworkCore;
using WebApplication1.Models;
namespace WebApplication1.Data
{
public class BloggingContext : DbContext
{
public BloggingContext(DbContextOptions<BloggingContext> options)
: base(options)
{ }
public DbSet<Blog> Blogs { get; set; }
}
}
リポジトリ(IBloggerRepository.cs & BloggerRepository.cs)
using System;
using System.Collections.Generic;
using WebApplication1.Models;
namespace WebApplication1.Data
{
internal interface IBloggerRepository : IDisposable
{
IEnumerable<Blog> GetBlogs();
void InsertBlog(Blog blog);
void Save();
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using WebApplication1.Models;
namespace WebApplication1.Data
{
public class BloggerRepository : IBloggerRepository
{
private readonly BloggingContext _context;
public BloggerRepository(BloggingContext context)
{
_context = context;
}
public IEnumerable<Blog> GetBlogs()
{
return _context.Blogs.ToList();
}
public void InsertBlog(Blog blog)
{
_context.Blogs.Add(blog);
}
public void Save()
{
_context.SaveChanges();
}
private bool _disposed;
protected virtual void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
_context.Dispose();
}
}
_disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
}
Startup.cs(関連コード)
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddDbContext<BloggingContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddScoped<IBloggerRepository, BloggerRepository>();
services.AddMvc();
// Add application services.
services.AddTransient<IEmailSender, AuthMessageSender>();
services.AddTransient<ISmsSender, AuthMessageSender>();
}
コントローラ (BlogController.cs)
using System.Linq;
using Microsoft.AspNetCore.Mvc;
using WebApplication1.Data;
using WebApplication1.Models;
namespace WebApplication1.Controllers
{
public class BlogController : Controller
{
private readonly IBloggerRepository _repository;
public BlogController(BloggerRepository repository)
{
_repository = repository;
}
public IActionResult Index()
{
return View(_repository.GetBlogs().ToList());
}
public IActionResult Create()
{
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Create(Blog blog)
{
if (ModelState.IsValid)
{
_repository.InsertBlog(blog);
_repository.Save();
return RedirectToAction("Index");
}
return View(blog);
}
}
}
何が間違っているのかよくわかりません。何か思い当たることはありますか?
解決方法を教えてください。
エラーメッセージを分解する。
<ブロッククオート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();
その他のパッケージについては、常にドキュメントを読んでください。
関連
-
[解決済み】ソケットのアドレス(プロトコル/ネットワークアドレス/ポート)は、通常1つしか使用できない?
-
[解決済み] DBNullから他の型にオブジェクトをキャストすることができない
-
[解決済み】MetadataException: 指定されたメタデータ・リソースをロードできない
-
[解決済み】Unity 「関連するスクリプトを読み込むことができません」「Win32Exception: システムは指定されたファイルを見つけることができません"
-
[解決済み】HRESULTからの例外:0x800A03ECエラー
-
[解決済み】アンギュラーコンポーネントにサービスを注入しようとするとエラー "EXCEPTION: Can't resolve all parameters for component"、なぜ?
-
[解決済み】Microsoft.Extensions.LoggingからILoggerを解決することができない
-
[解決済み] アクティベートを試みている間、タイプのサービスを解決できない
-
[解決済み】ASP.NET CoreのフォームPOSTでHTTP 415 Unsupported Media Typeのレスポンスが返ってくる。
-
[解決済み】InvalidOperationException: 型 'Microsoft.AspNetCore.Http.IHttpContextAccessor' のサービスを解決できません。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー。「戻り値を変更できません」 C#
-
[解決済み】Ajax処理で「無効なJSONプリミティブ」と表示される件
-
[解決済み】パディングが無効で、削除できない?
-
[解決済み】Socket.Selectがエラー "An operation was attempted on something that is not a socket" を返す。
-
[解決済み】Entity FrameworkからのSqlException - セッション内で他のスレッドが動作しているため、新しいトランザクションは許可されません。
-
[解決済み】値をNULLにすることはできません。パラメータ名:source
-
[解決済み】画像のペイントにTextureBrushを使用する方法
-
[解決済み】ファイルやアセンブリ、またはその依存関係の1つをロードできませんでした。
-
[解決済み】Microsoft.Extensions.LoggingからILoggerを解決することができない
-
[解決済み】スレッド終了またはアプリケーションの要求により、I/O操作が中断されました。