2

Entity Framework edmx モデル コンテキストを使用できる基本リポジトリ クラスをセットアップしようとしています。私が抱えている問題は、依存性注入を介してコンストラクターに渡すことができるように、EF EDMX オブジェクト コンテキストが実装するインターフェイスを見つける必要があることです。私はこれを作成して HttpContext に格納する DataFactory を使用することでこれを回避しましたが、それは単体テストの機能を殺します。どんな助けでも大歓迎です。ありがとう!

public abstract class BaseRepository<T> where T : EntityObject
{
        private MyDataModelContext _dataContext;
        private ObjectSet<T> dbset;

        protected BaseRepository(IObjectContext dataContext)
        {
            _dataContext = dataContext;
            dbset = _dataContext.CreateObjectSet<T>();
        }

    .....
4

1 に答える 1

4

私は常に、独自のインターフェイスを Context に渡す DataContextFactory を作成し、それを次のようにリポジトリに渡しました。

コンテキスト インターフェイス:

public IMyDataContext {
    // One per table in the database
    IDbSet<Class1> Class1s { get;set; }
    // etc

    // The standard methods from EF you'll use
    void Add( object Entity );
    void Attach( object Entity );
    void Delete( object Entity );
    void SaveChanges();
}

コンテキスト ファクトリ:

public class MyDataContextFactory : IMyDataContextFactory {
    public IMyDataContext GetContext() {
        // TODO: Use the service locator pattern to avoid the direct instanciation
        return new MyDataContext();
    }
}

コンテキスト ファクトリ インターフェイス:

public interface IMyDataContextFactory {
    IMyDataContext GetContext();
}

リポジトリ:

public class MyClass1Repository {
    private readonly IMyDataContextFactory factory;
    public MyClass1Repository( IMyDataContextFactory Factory ) {
        // TODO: check for null
        this.factory = Factory;
    }
    public List<MyClass1> GetAll() {
        using ( IMyDataContext db = this.factory.GetContext() ) {
            return db.Class1s.ToList();
        }
    }
    // TODO: Other methods that get stuff
}

次に、リポジトリをテストしたいときは、から偽物IMyDataContextFactoryを返す偽物を渡します。IMyDataContextGetContext()

やがて、リポジトリの重複に気付き、特定のメソッドをベース リポジトリにプッシュできます: GetAll()、一貫した主キーがSave()あるGetById()場合など

于 2012-05-05T17:54:10.250 に答える