2

私はEFを使用してMVCアプリケーションを作成しており、現在、次のような汎用リポジトリパターンを使用しています:汎用リポジトリパターン。リポジトリごとに新しいコンテキストが作成され、アプリケーションで2つ以上のリポジトリを操作する必要があるという事実を除いて、すべてがうまく機能しました。StructureMapを使用しているので、追加しました

x.For<IDbContext>().HttpContextScoped().Use(context => new MyContext());

ここで、IDbContextにはそれぞれのメソッドがあり、汎用ではなくなりましたが、コンストラクターを介して渡されます。

問題は、物事をテストする必要があるときに発生します。たとえば、HashTableやHashSetなどのメモリ内ストレージ(dbよりも高速、カスタム、データの制御が簡単)を作成したい場合です。私が理解できないのは、そのHashTableからデータを取得するIDbContextの偽の実装を作成する方法です。参考までに、IDbContextは次のようになります(汎用リポジトリでDbContextによって使用されるメソッドのみ)。

    public interface IDbContext : IDisposable
    {
        IDbSet<TEntity> Set<TEntity>() where TEntity : class;
        DbEntityEntry<TEntity> Entry<TEntity>(TEntity entity) where TEntity : class;
        int SaveChanges();
    }

現在の状況では、偽のコンテキストを作成することは通常のルーチンではないように思われるため、私は大きな間違いを犯したと思います。アプリケーションのアーキテクチャを改善し、テスト可能にする方法についてのアドバイスをいただければ幸いです。

4

1 に答える 1

0

過去にこれを行ったとき、通常、次のようなテストデータを保持するために Dictionary を使用しました。

public class FakeDb : IDbContext
{
    private Dictionary<Type, Object> _lists = new Dictionary<Type, Object>();
    public List<T> GetList<T>()
    {
        var type = typeof(T);
        if(!_lists.Contains(type))
        {
            _lists.Add(type, new List<T>());
        }
        return (List<T>)_lists[type];
    }

    ///
}

より広い観点から、クエリ構築ロジックをリポジトリ クラスではなく個々のクラスにラップすることで、多くの成功を収めました。

于 2012-09-14T12:59:55.410 に答える