最佳实践|如果每个实体都有不同的存储库,那么放置搜索逻辑的位置

时间:2013-06-04 10:41:58

标签: c# entity-framework

我正在开发一个应用程序,其中有不同的存储库用于不同的实体,现在我必须放置搜索逻辑,因此我很困惑我应该在哪里放置我的搜索逻辑,如果我创建一个新的搜索存储库或者我应该放现有存储库中的逻辑,如果我应该在一个现有的存储库中放入哪一个。

下面列出了存储库

public class VendorRepository
{

}

public class ProductRepository
{

}

Public Class ProductBatchRepository
{

}

7 个答案:

答案 0 :(得分:2)

我喜欢使用的替代方法......

......你可以seperate commands from queries。您的命令将使用底层域模型和存储库(就像您现在拥有的那样?);而您的查询可以使用其他技术;例如;首先使用实体​​框架代码直接查询数据库。

通过这种方式,您可以灵活地查询(使用LINQ)并绕过不会为查询目的增加价值的图层,并专门为您的客户设计返回类型。您甚至可以使用数据库视图,这样可以更容易查询。

答案 1 :(得分:2)

为什么不是基础存储库?像这样:

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>
{

}

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

我不是100%肯定我理解你的问题,但是如果你的意思是你有不同数据库的连接并希望实现搜索逻辑,那么我倾向于创建一个专门处理搜索的类 - 将此功能与您的数据总是倾向于良好的ide,因为这意味着逻辑将与您可能做的任何更改完全分开,从而在您意外删除存储库时免于删除。

答案 5 :(得分:1)

如果它是您正在撰写的网络应用,为什么不简单地实施谷歌的锚标记链接?这将使您免于必须自己编写代码。

答案 6 :(得分:0)

那么感谢每一位参与讨论的人,我已经对此进行了大量搜索,最后我决定将逻辑放在不同的存储库中,因为这不符合最佳实践,但这是最好的解决方案在我的问题。