web-dev-qa-db-ja.com

アクティブ化しようとしているときにタイプのサービスを解決できません

ファイルが1つありますRepository.cs次のようなインターフェースとその実装を含む:

public interface IRepository

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

public class MemoryRepository : IRepository
{
    private List<City> cities = new List<City> {
        new City { Name = "London", Country = "UK", Population = 8539000},
        new City { Name = "New York", Country = "USA", Population = 8406000 },
        new City { Name = "San Jose", Country = "USA", Population = 998537 },
        new City { Name = "Paris", Country = "France", Population = 2244000 }
    };

    public IEnumerable<City> Cities => cities;

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

そして、HomeControllerでは、Citiesゲッターを次のようにビューに渡そうとしています。

public class HomeController : Controller
    {
        private IRepository repository;

        public HomeController(IRepository repo)
        {
            repository = repo;
        }

        public IActionResult Index()
        {
            return View(repository.Cities);
        }

    }

しかし、私はこのエラーを受け取ります:

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

12

IRepositoryをDependency Injectionフレームワークに登録する必要があります。たとえば、ConfigureServicesに次を追加できます。

services.AddScoped<IRepository, MemoryRepository>();

ASP.NET Coreでの依存性注入の詳細については、 here を参照してください。

AddScopedは単なる例ですが、より一般的なアプローチの1つです。

スコープ付きライフタイムサービスは、リクエストごとに1回作成されます。

22
Kirk Larkin

エンティティフレームワークコアデータベースの最初のアプローチでこのエラーが発生しています。以下の手順に従ってエラーを解決しましたenter code here

手順1:コンテキストクラスコンストラクターが次のようになっていることを確認する

public partial class ZPHSContext : DbContext
{
    public ZPHSContext(DbContextOptions<ZPHSContext> dbContextOptions):base(dbContextOptions)
    {
    }
}

ステップ2:スタートアップファイル内

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    services.AddDbContext<ZPHSContext>(options => options.UseSqlServer(Configuration.GetConnectionString("BloggingDatabase")));
}

ステップ3:appsettingsの接続文字列

"ConnectionStrings": {
    "BloggingDatabase": "Server=Server=****;Database=ZPHSS;Trusted_Connection=True;"
}

ステップ4:コンテキストクラスのOnConfiguringメソッドのデフォルトコードを削除する

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
}
4

DO(Dependency Injection)セクションに実装を追加する必要があります。 .Net Core Mvcの場合、次のようになります。

 public void ConfigureServices(IServiceCollection services)
 {
   services.AddDbContext<ApplicationDbContext>(options =>
    options.UseInMemoryDatabase()
   );
   services.AddScoped<IRepository, MemoRepostory>();

 }
2
Ekrem

これはコードサンプルには役に立たないかもしれませんが、私の場合、同じエラーは循環依存関係の結果でした。

1
gneric

このようなメソッドをStartupに追加する必要があります:

    // This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    //...

    // Add application services.
    services.AddTransient<IRepository, MemoryRepository>();

    //..
}

サービスは使用する前に登録する必要があります。

PDATE:アプリケーションでDIを使用しない場合は、次のようにMemoryRepositoryのコンストラクターでHomeControllerのインスタンスを作成します。

public class HomeController : Controller
    {
        private IRepository repository;

        public HomeController()
        {
            repository = new MemoryRepository();
        }

        public IActionResult Index()
        {
            return View(repository.Cities);
        }

    }
0
Afshar Mohebbi

他の答えは正しいですが、新しいasp.netコア2.1.xプロジェクトをスピンアップしていて、このエラーが発生しました。

結局私はタイプミスになってしまいました。

そのため、このようなインターフェイスを正しく使用する代わりに、私のコントローラーで

public HomeController(IApplicationRepository applicationRepository)
{
    _applicationRepository = applicationRepository;
}

私のタイプミスでは、ApplicationRepositoryの代わりにApplicationRepositoryを使用していました。そのため、欠落している「I」を見つけるエラーはありませんでした:/

public HomeController(ApplicationRepository applicationRepository)
{
    _applicationRepository = applicationRepository;
}

したがって、コントローラーはDIを解決していません...

0
Tom Stickel