私は常に、独自のインターフェイスを 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
を返す偽物を渡します。IMyDataContext
GetContext()
やがて、リポジトリの重複に気付き、特定のメソッドをベース リポジトリにプッシュできます: GetAll()
、一貫した主キーがSave()
あるGetById()
場合など