【问题标题】:How to use Entity Framework context with dependency injection?如何将实体框架上下文与依赖注入一起使用?
【发布时间】:2012-05-05 17:42:44
【问题描述】:

我正在尝试设置一个可以使用实体框架 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>();
        }

    .....

【问题讨论】:

    标签: asp.net-mvc-3 entity-framework-4 dependency-injection repository-pattern


    【解决方案1】:

    我总是创建一个 DataContextFactory,它将我自己的接口传递给 Context,并将它传递给我的存储库,如下所示:

    上下文接口:

    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 模型。
    • 使用 DbContext(我的)和 ObjectContext(你的)之间的唯一区别是 IMyDataContext 将具有特定于 ObjectContext 的方法,例如 .AddObject() 和 .DeleteObject() 而不是 .Add() 和 .Remove ()。
    • 一般的前提是上下文是查询不可知的,数据存储特定的,存储库是一个强类型的包装器,它将它作为查询特定的数据填充给调用者/应用程序的其余部分存储不可知的调用。他们传入参数,取回一个对象或列表。切换到一个新的数据存储,删除上下文,重命名存储库的内部,应用程序的其余部分保持不变。
    • ... 实例化 DataContext 的唯一东西是工厂,存储库之外的任何东西都不会引用它。
    • 那么这会为每个存储库创建一个新的上下文实例吗?我正在使用 MVC,我认为每个请求只有一个 DataContext 是一种好习惯
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-21
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多