我总是创建通过我自己的接口的背景下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
返回从GetContext()
假IMyDataContext
。
随着时间的推移,我注意到在库重复,并且可以推动某些方法到基本信息库:GetAll()
,Save()
,GetById()
有时候如果我有一致的主键等
这是否仅适用于EF POCO对象的工作?我正在使用EF EDMX模型。 – NullReference
使用DbContext(我的)和ObjectContext(你的)之间的唯一区别是IMyDataContext将具有像.AddObject()和.DeleteObject()而不是.Add()和.Remove()这样的ObjectContext特定方法。 – robrich
一般的前提是Context是查询不可知的,特定于数据存储区的,Repository是一个强类型的包装器,它将这个调用器/应用程序的其余部分作为特定于查询的数据存储不可知调用提供。他们传递参数,找回对象或列表。交换到一个新的数据存储,你直接上下文,重命名仓库的内部,应用程序的其余部分保持不变。 – robrich