1. ホーム
  2. c#

[解決済み] アクティベートを試みている間、タイプのサービスを解決できない

2022-02-12 21:26:27

質問

ASP.NET Coreアプリケーションで、以下のエラーが発生します。

InvalidOperationException: Cities.Controllers.HomeController' をアクティブにしようとしているときに、タイプ 'Cities.Models.IRepository' のサービスを解決できません。

私は HomeController を渡そうとしているのです。 Cities ゲッターはこのようにビューに渡されます。

public class HomeController : Controller
{
    private readonly IRepository repository;

    public HomeController(IRepository repo) => repository = repo;

    public IActionResult Index() => View(repository.Cities);
}

私は1つのファイル Repository.cs というように、インターフェースとその実装を含んでいます。

public interface IRepository
{
    IEnumerable<City> Cities { get; }
    void AddCity(City newCity);
}

public class MemoryRepository : IRepository
{
    private readonly List<City> cities = new List<City>();

    public IEnumerable<City> Cities => cities;

    public void AddCity(City newCity) => cities.Add(newCity);
}

私の Startup クラスには、テンプレートからデフォルトで生成されたコードが含まれています。私は何らかの変更を加えました。

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllersWithViews();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        ...
    }
}

解決方法は?

Dependency Injectionフレームワークで解決するために IRepository は、まずコンテナに登録される必要があります。たとえば ConfigureServices に、以下を追加します。

services.AddScoped<IRepository, MemoryRepository>();

を使用する.NET 6+の場合 新しいホスティングモデル に以下を追加してください。 プログラム.cs の代わりに

builder.Services.AddScoped<IRepository, MemoryRepository>();

AddScoped は、あくまで一例です。 サービス寿命 :

Webアプリケーションの場合、スコープ付きライフタイムは、サービスがクライアントのリクエスト(接続)ごとに一度だけ作成されることを示します。

を参照してください。 ドキュメント は、ASP.NET Core の Dependency Injection の詳細について説明します。

関連