Web API、.Net Core、およびEntityFrameworkCoreを使用してサービスアプリケーションを構築しています。
DbContextでオプションを構成するために、Startup.csの「ConfigureServices」メソッドでこれらの行を使用しています
var connection = @"Server=ISSQLDEV;Database=EventManagement;Trusted_Connection=True;";
services.AddDbContext<EMContext>(options => options.UseSqlServer(connection));
コントローラーのコンストラクターパラメーターとしてコンテキストを追加すると、.Netがコンストラクターにコンテキストを挿入することを知っています。
しかし、これは私が望む行動ではありません。 WebAPIにdbcontextについて何も知られたくない。すべてのCRUD操作を処理するリポジトリクラスを持つDataAccessプロジェクトがあります。
これは、コントローラーでRepository.AddEvent(evt)と言いたいだけで、リポジトリがそれを処理する方法を知っていることを意味します。
一方、リポジトリは単純な依存関係リゾルバーを使用して、適切な「IDataAdapter」実装を取得します。それらの実装の1つはSQLDataAdapterです。これが私の文脈が必要なポイントです。
どうすればコンテキストをこの時点まで渡すことができますか?
これを解決するには、コンストラクターインジェクションを介してdbcontextをデータアクセス層からクラスに追加します。
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(o => o.UseSqlServer(myConnStr));
services.AddScoped<Repository>(); // 'scoped' in ASP.NET means "per HTTP request"
}
}
public class MvcController
{
private Repository repo;
public MvcController(Repository repo)
{
this.repo = repo;
}
[HttpPost]
public void SomeEndpoint()
{
this.repo.AddFoo(new Foo());
}
}
public class Repository
{
private DbContext db;
public Repository(ApplicationDbContext db)
{
this.db = db;
}
public void AddFoo(Foo obj)
{
this.db.Set<Foo>().Add(obj);
this.db.SaveChanges();
}
}
DbContextがDIコンテナに挿入される方法をさらにカスタマイズしたい場合は、.AddDbContext
が実際に行っていることを確認することをお勧めします。 https://github.com/aspnet/EntityFramework/blob/1.0.0/src/Microsoft.EntityFrameworkCore/EntityFrameworkServiceCollectionExtensions.cs#L142-L158 を参照してください