Asp.NetコアでDbContextを挿入します。具体的なタイプまたはインタフェース?

asp.net-core entity-framework-core

質問

Asp.Netコアプロジェクトで、私はEntity Framework DbContextをインジェクトしています:

public MessageRepository(MyDbContext context) {
}

そして構成は次のとおりです。

services
  .AddEntityFramework()
  .AddSqlServer()
  .AddDbContext<Context>(x => x.UseSqlServer(connectionString);

インターフェイス、IMyDbContextを作成し、代わりにそれを注入する必要がありますか?

public class MyDbContext : DbContext, IMyDbContext { }

public MessageRepository(IMyDbContext context) {
}

すべてのASP.NETコアの例では、具体的な型MyDbContextが注入されていて、インタフェースではないことがわかります...

私はどのような選択肢を選ぶべきですか?

受け入れられた回答

ユニットテストと統合テストを模擬する方が簡単なので、私たちは常にインターフェイスを注入しています。

  1. MessageRepositoryコンストラクタの署名を変更しますか?それは具体的なタイプに依存します。
  2. あなたのコードのテストを書いていますか? andを使用すると、データベースコンテキストを模擬するのが簡単になります。

上記のいずれかに「いいえ」と答えた場合は、具体的なタイプを注入してください。それ以外の場合は、インタフェースを挿入します。


人気のある回答

現在、自分自身でプロジェクトに取り組んでいます。ここでは、このような2つのインターフェースを使うことにしました

public interface IDbContext : IDisposable
{
    DbContext Instance { get; }
}

そして

public interface IApplicationDbContext : IDbContext
{
    DbSet<MyEntity> MyEntities { get; set; }
    ...
}

私の具体的なDbContextは、アプリケーションコンテキストインターフェイスを実装するだけです

public class ApplicationDbContext : DbContext, IApplicationDbContext
{
    public DbContext Instance => this

    public DbSet<MyEntity> MyEntities { get; set; }
}

これにより、私のアプリケーションコンテキストの実装をアプリケーションコンテキストインタフェースとして注入することができます。また、DbContextクラスからインタフェースに必要なメソッドを追加することなく、Instanceプロパティゲッターを介してDbContextメソッドにアクセスできます。

今まで、これは素晴らしい作品です。



Related

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