最佳实践|如果我们对每个实体有不同的存储库,在哪里放置搜索逻辑

本文关键字:存储 在哪里 搜索 如果 我们 实体 最佳 | 更新日期: 2023-09-27 18:16:54

我正在研究一个应用程序,其中对不同的实体有不同的存储库,现在我必须把搜索逻辑,因此我很困惑我应该把我的搜索逻辑放在哪里,我应该为搜索创建一个新的存储库,还是应该把逻辑放在现有的存储库中,如果我应该把一些现有的存储库是哪一个。

存储库列在下面

public class VendorRepository
{
}
public class ProductRepository
{
}
Public Class ProductBatchRepository
{
}

最佳实践|如果我们对每个实体有不同的存储库,在哪里放置搜索逻辑

为什么不使用基础存储库呢?像这样:

public class GenericRepository<T>
{
    protected IDbSet<T> Query<T>()
    {
        return myContext.GetDbSet<T>();
    }
    public IEnumerable<T> Where<T>(Expression<Func<T, bool>> predicate)
    {
        return Query<T>().Where(predicate).ToList();
    }
   ...
}

,然后是仓库:

public class ProductRepository : GenericRepository<Product>
{
}
public class VendorRepository : GenericRepository<Vendor>
{
}

我喜欢使用的另一种方法…

…您可以将命令与查询分开。您的命令将使用底层领域模型和存储库(就像您现在拥有的那样?)虽然你的查询可以使用另一种技术;例如;首先使用实体框架代码直接查询数据库。

这样你就有了查询的所有灵活性(使用LINQ)和绕过不为查询目的增加价值的层,并为你的客户端专门设计返回类型。您甚至可以使用数据库视图,如果这将使查询更容易。

我将创建用于搜索各自存储库中的每个实体的方法,并创建另一个类,该类将调用所有这些方法来搜索所有内容并将结果转换为所需的形状…

您应该以这种方式在每个存储库中创建搜索方法,当您只想搜索产品时,您可以执行productrerepository . search (....)这也将允许您优化每个存储库的搜索方法,这将比一次大规模搜索更快。

我不能100%肯定我理解你的问题,但如果你的意思是你有连接到不同的数据库,并想要实现搜索逻辑,那么我倾向于创建一个类专门处理搜索-从你的数据分离这个功能总是倾向于一个好主意,因为它意味着逻辑将完全独立于你可能做的任何更改,从而免于删除,如果你不小心删除存储库。

如果你正在编写一个web应用程序,为什么不简单地实现一个锚标签链接到谷歌?这将使您不必自己编写代码。

好吧,感谢大家参加讨论,我已经搜索了很多关于这个,最后我决定把逻辑在不同的存储库,因为这不遵循最佳实践,但这是在我的问题的最佳解决方案。