2

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

を::

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(); 
} 

コンテキストファクトリを私は常にコンテキストに自分のインタフェースを渡しDataContextFactoryを作成し、そのように私のリポジトリにあることを渡されました

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

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 
} 

はその後、私はGetContext()から偽IMyDataContextを返し、偽のIMyDataContextFactoryに渡します。時間で

私はリポジトリに重複を気づき、そしてベースリポジトリに特定のメソッドをプッシュすることができます:私は一貫性のある主キーを持っている場合など、時にはGetAll()Save()GetById()

+0

はEF POCOオブジェクトのために働くことにしていますか?私はEF EDMXモデルを使用しています。 – NullReference

+0

DbContext(mine)とObjectContext(yours)を使用する唯一の違いは、IMyDataContextに.Add()や.Remove()の代わりに.AddObject()や.DeleteObject()などのObjectContext固有のメソッドがあることです。 – robrich

+0

一般的な前提は、コンテキストがクエリに依存しないデータストア固有であることです。リポジトリは、クエリ固有のデータストアにとらわれない呼び出しとして、呼び出し元/アプリケーションの残りの部分にシンクする強固な型のラッパーです。彼らはparamsを渡し、オブジェクトやリストを返す。新しいデータストアにスワップすると、コンテキストが消滅し、リポジトリの内部が改名され、残りのアプリケーションは同じ状態になります。 – robrich

関連する問題