【问题标题】:Repository pattern for database that allows CRUD operations through Interops允许通过 Interops 进行 CRUD 操作的数据库存储库模式
【发布时间】:2016-08-13 16:09:25
【问题描述】:

我们目前面临的情况是模型实体和数据库逻辑紧密交织在一起,这使得单元测试变得不可能。所以,我决定设计一个存储库模式。我们通过 Com 交互 Root-Children[每个孩子都是另一个 Root] 看到的存储模型的基本结构。这是一个树形结构。了解这一点,我们设计的存储库是 RootRepository,用于对根进行 CRUD 操作,而 ChildRepository 位于 RootRepository 内部,用于对子项进行 CRUD 操作。我们决定 Create 仅用于创建实体但不持久化它,但更新将仅在数据库中未找到任何实体键时插入或在找到时更新。 Read 将按键获取实体。因此,在与存储库 API 交互时,我们决定首先使用密钥获取实体,如果它为空,则调用创建基本实体(存储库使用工厂),如果需要,可以对其进行更新,并使用更新将其持久化回数据库。因为它是一个指向另一个实体的 Value 对象,所以它本身不能被持久化。要持久化子对象,我们必须先持久化子引用实体,然后再请求根存储库以创建子对象,并且可以将其添加到父子集合中,并调用父持久性,这样子对象将与父对象一起持久化。

所以,我想知道我们所遵循的方法和设计模式确实符合标准。据我们所知,这是我们获得单元测试支持和使用最少数据模拟进行测试的唯一方法。我在网上四处寻找构建存储库的想法,但没有任何帮助。我在这里的大部分问题都将在我们的单元测试中得到解决,但我想知道是否已经存在任何设计模式。在这个早期阶段,很容易迁移到任何标准框架(如果存在),我希望我能从你们那里得到任何指导。

【问题讨论】:

    标签: c# repository repository-pattern ddd-repositories testdrivendesign


    【解决方案1】:

    实现下面的代码,您将能够在所有实体中重复使用它。

    public interface IRepository<T> where T : class
    {
        T Find(params object[] id);
        IQueryable<T> Where(Expression<Func<bool, T>> predicate);
        T Add(T entity);
        T Update(T entity);
        void Delete(T entity);
    }
    
    public class Repository<T> where T : class
    {
        private DbSet<T> dbSet;
        public Repository(ApplicationContext context)
        {
            this.dbSet = context.Set<T>();
        }
    
        public T Find(params object[] id) { throw new NotImplementedException(); }
        public IQueryable<T> Where(Expression<Func<bool, T>> predicate) { throw new NotImplementedException();}
        public T Add(T entity){ throw new NotImplementedException();}
        public T Update(T entity){ throw new NotImplementedException();}
        public void Delete(T entity){ throw new NotImplementedException();}
    }
    

    【讨论】:

    • 我们使用了类似的模式。但是为我们的需要创建一个自定义的 Dbset 几乎是不可能的。由于子引用实体没有子实体就没有范围。 E1-child-E2,E2 上下文可以是另一个类似结构的一部分,但它不会是同一个对象。例如:Wheel 是一个实体对象,但在上下文中,它可以是两个轮子,即汽车的左右轮。当我们遍历树结构 Car->right->Wheel 和 Car->left->wheel 时。 right 和 left 都是 Car 的孩子。左或右没有身份,但握着轮子。轮子的基本定义是相同的,但它们将是两个不同的数据库对象
    • 您需要在每个请求生命周期中注入该依赖项
    • 所以这是唯一的方法,当然我们完全按照你说的做了。应用程序上下文是每个周期的。谢谢回答。除非我得到其他答案,否则我会坚持这个想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    • 2018-06-14
    • 2021-05-01
    • 2016-10-08
    • 2016-03-15
    相关资源
    最近更新 更多