Net Core应用程序可以同时具有存储库和DAO数据访问对象模式吗?

时间:2018-10-02 07:15:20

标签: c# asp.net-core repository domain-driven-design asp.net-core-2.0

我阅读了存储库,不应使用IQueryable。简单的存储库示例具有ListAll,FindById,Add,Delete。以下是示例产品存储库ListAll。如果我无法覆盖查询,而需要搜索查询(例如,按类别的ProductTable或按重量的ProductTable(复杂查询)),则需要DAO(数据访问对象模式)。

问题是,

(a)可以在同一应用程序中使用存储库模式和DAO模式吗?

(b)难道这不会绕过拥有DDD存储库模式的全部问题吗?

在仍通过存储库的情况下,如何访问具有复杂请求的ProductTable?第一个存储库查询将很慢。

public virtual IEnumerable<Products> List()
{
    return _dbContext.Products.AsEnumerable();
}

// This repository pattern will be slow, first it access all product and Then filters

var result = context.products()
               .Where(o => o.ProductCategoryId== 5);


// This is dao pattern, with more specific queries

var result = context.products.AsEnumerable()
               .Where(o => o.ProductCategoryId== 5);

Entity Framework Repository Pattern why not return Iqueryable?

https://deviq.com/repository-pattern/

1 个答案:

答案 0 :(得分:0)

存储库 适用于汇总。它返回一个完全构成的聚合,主要用于交易目的。数据更改通过汇总进行。您不应该真的查询聚合,因为它们可能不是返回相关/简洁数据的最佳选择。

query 层是一个 read模型,它仅以尽可能轻量的机制返回相关数据。您可以 将其视为DAO,但实际上并没有什么不同,尽管它肯定是专注于数据检索。

从这个意义上说,你在提出什么建议。这两种机制不仅可行,而且我强烈建议您采用这种方式:)

由于这两种机制之间的意图如此不同,因此拥有查询机制绝不会降低存储库的实用性。