C# 存储库模式—全局存储库是个好主意吗?

C# 存储库模式—全局存储库是个好主意吗?,c#,dependency-injection,ninject,repository-pattern,C#,Dependency Injection,Ninject,Repository Pattern,我在WCF服务中有以下接口: IPProductRepository IFieldRepository IFieldValueRepository ICategoryRepository 我在一个名为DatabaseRepository的单独项目中实现了其中的每一个,而产品、字段、字段值和类别都位于服务和存储库项目之间共享的公共库中 产品包含字段,而字段又包含字段值。我不喜欢我的服务构造函数有4个传入的存储库的想法,因此我还有IGlobalRepository,它包含每个存储库的一个属性。我

我在WCF服务中有以下接口:

  • IPProductRepository
  • IFieldRepository
  • IFieldValueRepository
  • ICategoryRepository
我在一个名为
DatabaseRepository
的单独项目中实现了其中的每一个,而
产品
字段
字段值
类别
都位于服务和存储库项目之间共享的公共库中

产品包含字段,而字段又包含字段值。我不喜欢我的服务构造函数有4个传入的存储库的想法,因此我还有
IGlobalRepository
,它包含每个存储库的一个属性。我通过将
IGlobalRepository
的具体实现传递给构造函数来实例化我的服务,当服务托管在IIS中时,使用基于Ninject约定的绑定来为我处理这个问题

因此,在我的web服务上,
GetProductsByCategory
看起来像这样:

private IGlobalRepository Repo { get; set; }

public IEnumerable<Product> GetProductsByCategory(int CategoryID){
    return Repo.ProductRepository.GetByCategory(int CategoryID);
}
private-IGlobalRepository-Repo{get;set;}
公共IEnumerable GetProductsByCategory(int CategoryID){
返回Repo.ProductRepository.GetByCategory(int CategoryID);
}
这一切都很好,只是产品有字段,字段有值。这是否意味着我需要将
IFieldRepository
IFieldValueRepository
的具体实现传递给
Repo.ProductRepository

我相信有人会建议
ProductRepository
也应该负责获取字段数据,但我将其放在一个单独的存储库中,这样我就可以独立于它们所连接的产品获取字段

在我开始采用repository模式之前,我只需在Field或FieldValue上调用一个静态方法,以获得所需的内容。传递存储库似乎是一种不那么优雅的工作方式

现在我要问的是:


全局存储库是个好主意吗?我意识到这在一定程度上是主观的,但我很想听听其他人的意见,更重要的是,对于这种情况,什么是最佳实践。

我认为全球存储库不是一个好主意

您应该根据使用情况创建存储库定义。所以是的,产品回购应该返回所有必需的数据,它与FieldRepo或其他回购无关

应用程序仅与接口耦合,一个存储库可以实现多个接口。此外,您可以让不同的具体存储库使用相同的数据库。回购的意义不在于每个实体都有一个回购,而是为应用程序提供一个接口,从现有的应用程序中获得它所需要的。你如何在坚持中构建事物,那是另一回事

因此,至少作为一个实验,尝试重新定义repo接口,直接返回应用程序需要的对象,忽略哪个是实体,哪个对象是另一个实体的一部分等等


然后开始实施具体的回购协议。请记住,应用程序需要多少型号,你就有多少型号。只有在很小的情况下,才有一个模型需要规则。我都是

你在这个项目中写单元测试吗?是的,我是。事实上,我正在重构一个现有的项目,以使用存储库模式来达到这个目的;这没什么错。你所做的听起来像是WCF项目中的大量代码和大量维护。您可能需要考虑使用需要较少维护的设计,例如。