2017-02-28 13 views
0

ASP.Net Coreに移行する前に、Ninjectを使用して、エンティティフレームワークデータベースコンテキストを一般的な方法で挿入することができました。例えば:私は、次の操作を行う場合はASP.Net MVCのコアでASP.Net Core MVC:Base Typeによる依存性注入

Bind<DbContext>().To<MyActualDbContext>(); 

は、AddDbContextを使用した場合、それが未解決であることのサービスになります。

AddDbContext<MyActualDbContext>(x=> x.UseSqlServer("...")); 
--- 
public class TestController: Controller { 
    public DbContext Db {get; private set;} 
    public TestController(DbContext Db){ 
     this.Db = Db; 
    } 
} 

は私がAddDbContextは、特別EFデータコンテキストを処理するために使用するために開発されてきたので、私は、しかし、AddSingletonまたはAddScopedのいずれかを使用してこの問題を解決することができることを知って、私はにどのような方法がありますかどうかを知りたいのですがその方法を使ってこれを達成する。

AddDbContextがこの動作をサポートしていない場合は、どちらの方法がより良いでしょうかAddSingletoneまたはAddScoped?私はAddScopedがリクエストごとに1回サービスをインスタンス化することを知っていますが、シングルトンが潜在的な問題を引き起こすかどうかを知りたいと思います。私はこれらの2つのメソッドを使用してもED DbContextの場合には不都合がないことを確認したいと思います。

答えて

2

あなたは

// Or use AddTransient, makes no difference as it only wraps around the 
// container resolve method 
services.AddScoped<DbContext>(provider => provider.GetRequiredService<MyActualDbContext>()); 

を使用することができますが、あなたはそれをキャストすることなく、それを使用することはできませんので、基本クラスは、それのDbSetsのいずれかを持っていないので、正直、私には、そうすることで利益が表示されません元のコードですが、これは、IOCをまったく持っているという考えを打ち負かしています。

はい、シングルトンのDbContextに問題があります。メモリリークが発生する可能性があります(トラッキングキャッシュは増加し続けます)。そして、どこかに配置すると、DIシステムは常にシングルトンコンテキストの破棄されたインスタンスを返します。

+0

DbContextには、 "Set <>、Add <>、Entity <>などのメソッドがあります。 dbを一般的な方法で使用することができます。同じデータベースに対して異なるコンテキストがあるとします。 – Arrrr

+0

'AddTransient'は良いアイデアではありません(EFのトラッキングメカニズムのため)。 – Arrrr

+0

この場合、オブジェクトの存続期間は 'AddDbContext'によって制御されるので、問題はありません。スコープで登録すると、 'services.AddScoped (provider => provider.GetRequiredService provider.GetRequiredService () 'はスコープ付きインスタンスも常に返します。 ' – Tseng

関連する問題