Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 存储库设计模式_Design Patterns_Repository Pattern - Fatal编程技术网

Design patterns 存储库设计模式

Design patterns 存储库设计模式,design-patterns,repository-pattern,Design Patterns,Repository Pattern,我见过许多存储库模式实现。特别是两种类型 它们公开了通用存储库,该存储库是可查询的,并且需要服务类中的lamba表达式从数据库中获取数据 根据业务需求编写从数据库获取数据的方法,并封装检索数据的逻辑(甚至lambda) 哪种方法更好?我真的更喜欢第二种方法 就连我在.NETWorld上也看到过顶级博主的文章,对我来说,查询功能在存储库中是邪恶的 原因: 存储库类似于对象的集合,但存储在其实现定义的任何位置 存储库抽象数据映射到对象的方式。数据存储可以是任何形式,但业务依赖于存储库来检索、添加、更

我见过许多存储库模式实现。特别是两种类型

  • 它们公开了通用存储库,该存储库是可查询的,并且需要服务类中的lamba表达式从数据库中获取数据

  • 根据业务需求编写从数据库获取数据的方法,并封装检索数据的逻辑(甚至lambda)


  • 哪种方法更好?

    我真的更喜欢第二种方法

    就连我在.NETWorld上也看到过顶级博主的文章,对我来说,查询功能在存储库中是邪恶的

    原因:

  • 存储库类似于对象的集合,但存储在其实现定义的任何位置

  • 存储库抽象数据映射到对象的方式。数据存储可以是任何形式,但业务依赖于存储库来检索、添加、更新或删除域对象

  • 对底层存储的任何读写访问必须由存储库本身或任何其他底层管理

  • Queryable会破坏这些要点和/或原因中的大部分

    例如,如果可以使用IQueryable上的LINQ,为什么要设计GetProductByName、GetProductByCode

    而Queryable在n层场景中效果很差,因为除了返回延迟集的层之外,您将无法访问另一层中的数据库连接

    我不认为“可查询”的概念和存储库对于任何软件设计都是好的,因为它告诉我们存储库是无用的

    Queryable就像设计一个GetAll方法。存储库中的GetAll有什么意义?存储库将检索所有域对象,您将在业务中筛选它们。但是等待存储库不应该检索具有某些条件的域对象,是吗


    虽然我发现queryable与repository不兼容,但对我来说,设计和实现一些接受lambda表达式或任何委托的repository方法以提供某种过滤器或行为是可以的。这不是延迟执行,而是委托。

    我更喜欢第一个

    可查询版本更好,因为它需要更少的代码,并且更灵活

    你不必事先知道你在找什么

      // instead of repository.FindByMinimumAge(18)
      customerList = repository.Find<Customer>(c => c.Age >= 18)
    

    这可以通过NHibernate、Linq2Sql或“使用arraylist模拟”来实现。

    您是否将lambda与泛型混淆了。i、 e.IRepository是您的接口和产品存储库:IRepository是您的实现。但是,@k3b,那么,存储库的意义何在?只需从另一个源返回一个可查询文件,然后继续!:我完全同意你。。。很好…我也喜欢第二个。设计这样的存储库需要更多的痛苦,但它提供了正确的抽象。我只是想知道第二种方法是否会有瓶颈……我怀疑第二种方法的概念会有瓶颈。这是一个可预测的流程。很高兴知道它对你有用!
    public interface IRepository<T> where T : class
    {
        IEnumerable<T> Find(Expression<Func<T, bool>> where);
        ...
    }