数据库的存储库模式,允许通过Interops进行CRUD操作

时间:2016-04-20 19:07:32

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

我们目前面临的情况是模型实体和数据库逻辑紧密交织在一起,这使得单元测试变得不可能。所以,我决定设计一个Repository模式。我们通过Com交互看到的存储模型的基本结构Root-Children [每个孩子是另一个Root]。它是一种树状结构。理解这一点,我们设计的存储库是用于root用户的CRUD操作的RootRepository和用于子进程的CRUD操作的RootRepository内部的ChildRepository。我们决定创建仅用于创建实体但不保留它,但只有在DB中找不到密钥的实体或者在找到时更新时才更新。 Read将按键获取实体。因此,在与Repository API交互时,我们决定首先使用key获取实体,如果它为null,则调用Create basic entity(Repository使用factory),如果需要它可以更新,并使用update持久化回DB。没有子项可以自己保留,因为它是指向另一个实体的Value对象。为了坚持孩子,我们必须首先坚持孩子引用实体,然后请求root Repository创建子对象,并且可以将其添加到父子集合中,并且调用父持久性,因此子节点将与父节点一起持久化。

所以,我想知道我们遵循的方法,设计模式真的达到了标准。据我们所知,这是我们用最少的数据模拟获得单元测试和测试支持的唯一方法。我在网上四处寻找建立存储库的想法,但没有任何帮助我。我的大部分问题将在我们的单元测试中得到解决,但我想知道是否存在任何设计模式。在这个早期阶段,如果存在,很容易迁移到任何标准框架,我希望我能得到你们的任何指示。

1 个答案:

答案 0 :(得分: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();}
}