Entity FrameworkコアDbContextと依存性注入

asp.net-web-api2 dbcontext dependency-injection entity-framework entity-framework-core

質問

Web API、.Net Core、EntityFramework Coreを使用してサービスアプリケーションを構築しています。

私のDbContextのオプションを設定するために、私はStartup.csの "ConfigureServices"メソッドでこれらの行を使用しています

 var connection = @"Server=ISSQLDEV;Database=EventManagement;Trusted_Connection=True;";
 services.AddDbContext<EMContext>(options => options.UseSqlServer(connection));

コントローラにコンストラクタパラメータとしてコンテキストを追加すると、.NETがコンストラクタにコンテキストを挿入することがわかります。

しかし、これは私が望む行動ではありません。私は自分のWeb APIに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を参照してください。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ