2

我正在尝试设置一个可以使用Entity Framework edmx模型上下文的基本存储库类。我遇到的问题是我需要找到EF EDMX对象上下文实现的接口,以便通过依赖注入传递给构造函数。我之前已经通过使用DataFactory来创建它,并将它存储在HttpContext中,但这会杀死单元测试的能力。任何帮助,将不胜感激。谢谢!如何使用实体框架上下文与依赖注入?

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

我总是创建通过我自己的接口的背景下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()有时候如果我有一致的主键等

+0

这是否仅适用于EF POCO对象的工作?我正在使用EF EDMX模型。 – NullReference

+0

使用DbContext(我的)和ObjectContext(你的)之间的唯一区别是IMyDataContext将具有像.AddObject()和.DeleteObject()而不是.Add()和.Remove()这样的ObjectContext特定方法。 – robrich

+0

一般的前提是Context是查询不可知的,特定于数据存储区的,Repository是一个强类型的包装器,它将这个调用器/应用程序的其余部分作为特定于查询的数据存储不可知调用提供。他们传递参数,找回对象或列表。交换到一个新的数据存储,你直接上下文,重命名仓库的内部,应用程序的其余部分保持不变。 – robrich