2

クラスDBContextのコンストラクターにオブジェクト を渡す方法を教えてください。MyEntityRepsitory

例えば:

public interface IRepository<T> where T: class
{   
}

public class Repository<T> : IRepository<T> where T : class
{
    private readonly DbContext _dbContext;

    public Repository(DbContext dbContext)
    {
        _dbContext = dbContext;
    }
}

public interface IMyEntity : IRepository<MyEntity>
{
    MyEntity GetSingle(int Id);
}

public class MyEntityRepository : Repository<MyEntity>, IMyEntity
{
    public MyEntityRepository() : base(mydbContext){}
}

パターンを設計し、データ アクセス レイヤーのリポジトリ パターンを実装するのは初めてです。構造マップ/作業単位パターンを使用したことはありません。

DbContext合格できるようにオブジェクトを作成できる方法がいくつあるか知りたいです。

そして、さまざまなアプローチの違いを教えてください。

上記の例では、named という名前のクラスにコンストラクターがあり、オブジェクトをクラス コンストラクターMyEntityRepositoryに渡します。その方法を教えてください。dbContextRepository

どうもありがとう。

4

1 に答える 1

3

編集

@Trevor de Koekoek のコメントによると、を所有するラッパーの直接注入はDbContext、スレッド化とトランザクション境界の観点から問題になる可能性があります。

後から考えると、ファクトリの注入が推奨され、次のように使用されます。

  public ConsumingClass(IRepositoryFactory injectedRepositoryFactory)

そして(工場への参照を保持している場合)

      using (var applesRepository = _injectedRepositoryFactory.CreateRepository<Apples>())
      {
          ... do something with apples
      }

IDisposableまたはクラスに実装することによって。

これにより、クライアントにクリーンなリポジトリが提供され、クライアントはリポジトリ インスタンスの所有権を取得するよう強制されます。

元の回答

あなたが提案したように、これを行うには IoC コンテナー (StructureMap など) を構成する必要があります。使用する必要があるクラスにはIRepository<T>、コンストラクターまたはセッター注入によってインスタンスが注入されます。この IMO は、テスト容易性があり、Repository への結合は Interface のみを介して行われ、Repository も消費するクラスも IoC コンテナーに結合されないため、最もクリーンな実装です。

たとえば、コンストラクター注入を使用する:

public class ConsumingClass
{
  public ConsumingClass(IRepository<Apples> injectedApplesRepository)
}

具象クラスへのマッピングはIRepository、IoC Bootstrapper を介して (または構成で) 行われます。テスト容易性を向上させるために、リポジトリを ではなく に結合しますIDbContextDbContext

private void ConfigureIoC()
{
  For<IDbContext>().Use<MyDbContext>();
  For<IRepository<T>>().Use<Repository<T>>();
  // ... etc
}

消費するクラスが IoC によって構築されると、すべての依存関係 ( IRepository<T>、次にIDbContext) が再帰的に検出され、これらと依存関係などが構築されます。

その他の選択肢としては、Service Locator Pattern (クラスをロケーターに結合するため、現在ではアンチ パターンと見なされることが多い) やFactory Methodなどのパターンがあります。

于 2012-06-11T03:53:49.433 に答える