Asp.Net Coreに別のインタフェースを実装してDBContextを解決する

asp.net-core c# entity-framework-core

質問

私は署名を持っているEF Contextを持っています

public class MyContext : DbContext, IDbContext
{

}

それをサービスに追加すると、私はそれを使用します

services.AddDbContext<MyContext>(op =>
{
    op.UseSqlServer(configuration.GetConnectionString("DefaultConnection"));
});

しかし、私はIDbContextを注入しているときに問題を引き起こしています。

services.AddScoped(typeof(IDbContext), typeof(MyContext));

私のDbContextを複製しているので、リクエストごとに1つだけ必要です。

どうすれば解決できますか?

受け入れられた回答

あなたの場合は、ファクトリメソッドを使用して正常に動作するはずです。

services.AddScoped<IDbContext>(provider => provider.GetService(typeof(MyContext)));

このようにして、 MyDbContext (最初の呼び出し時)の新しいインスタンスを解決するか、決定的な呼び出しの要求中に既にインスタンス化されているインスタンスを返します。


人気のある回答

複数の異なるDbContextを登録している場合は、正しい特定のDbContextOptionsを使用してコンストラクタを正しく定義する必要があります。あなたがそうでないなら、あなたはDIによって解決されている間違った型を持つ危険性を冒します。

たとえば、OPに似たMyContext : DbContext, IDbContextを使用していましたが、 DbContextの一時記憶域に汎用のDbContextも使用していました。

services.AddDbContext<DbContext>(o =>
            {
                o.UseInMemoryDatabase(nameof(DbContext)); //tokens and stuff is stored in memory, not the actual users or passwords. 
                o.UseOpenIddict();
            });

決定的に、私のMyContextコンストラクタはあまりにも一般的でした - Visual Studioクイックアクションテンプレートを使って作成された:( ugh

違う:

public MyContext (DbContextOptions options) : base(options) { ... } 

これにより、DIは実行時に誤ったDbContextを解決します。

Microsoft.EntityFrameworkCore.Infrastructure:Information: Entity Framework Core 2.1.4-rtm-31024 initialized 'MyContext' using provider 'Microsoft.EntityFrameworkCore.InMemory' with options: StoreName=DbContext

ある時点で、私は自分のコンテキストに適したタイプのコンストラクタがないという不満を抱いたので、コンストラクタを次のように変更しました。

正しい:

public MyContext (DbContextOptions<MyContext> options) : base(options) { ... } 

そして今それは正しく動作します。



Related

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