ファイルが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」タイプのサービスを解決できません。
IRepository
をDependency Injectionフレームワークに登録する必要があります。たとえば、ConfigureServices
に次を追加できます。
services.AddScoped<IRepository, MemoryRepository>();
ASP.NET Coreでの依存性注入の詳細については、 here を参照してください。
AddScoped
は単なる例ですが、より一般的なアプローチの1つです。
スコープ付きライフタイムサービスは、リクエストごとに1回作成されます。
エンティティフレームワークコアデータベースの最初のアプローチでこのエラーが発生しています。以下の手順に従ってエラーを解決しました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)
{
}
DO(Dependency Injection)セクションに実装を追加する必要があります。 .Net Core Mvcの場合、次のようになります。
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseInMemoryDatabase()
);
services.AddScoped<IRepository, MemoRepostory>();
}
これはコードサンプルには役に立たないかもしれませんが、私の場合、同じエラーは循環依存関係の結果でした。
このようなメソッドを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);
}
}
他の答えは正しいですが、新しいasp.netコア2.1.xプロジェクトをスピンアップしていて、このエラーが発生しました。
結局私はタイプミスになってしまいました。
そのため、このようなインターフェイスを正しく使用する代わりに、私のコントローラーで
public HomeController(IApplicationRepository applicationRepository)
{
_applicationRepository = applicationRepository;
}
私のタイプミスでは、ApplicationRepository
の代わりにApplicationRepository
を使用していました。そのため、欠落している「I」を見つけるエラーはありませんでした:/
public HomeController(ApplicationRepository applicationRepository)
{
_applicationRepository = applicationRepository;
}
したがって、コントローラーはDIを解決していません...