存储库模式 - 是一个好主意的全局存储库?

时间:2013-11-29 15:10:09

标签: c# dependency-injection ninject repository-pattern

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

  • IProductRepository
  • IFieldRepository
  • IFieldValueRepository
  • ICategoryRepository

我在名为DatabaseRepository的单独项目中实施了这些内容,而ProductFieldFieldValueCategory都位于共享的公共库中服务和存储库项目之间。

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

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

private IGlobalRepository Repo { get; set; }

public IEnumerable<Product> GetProductsByCategory(int CategoryID){
    return Repo.ProductRepository.GetByCategory(int CategoryID);
}

这一切都很好,除了产品有字段,字段有值。这是否意味着我需要将IFieldRepositoryIFieldValueRepository的具体实现传递给Repo.ProductRepository

我确信有人会建议ProductRepository也应该负责获取字段数据,但是我将它放在一个单独的存储库中,以便我可以获取独立于它们所附加产品的字段。

在我开始采用存储库模式之前,我只需要在Field或FieldValue上调用静态方法,以获得我需要的东西。绕过存储库似乎是一种不那么优雅的工作方式。

现在问我的实际问题:

全球存储库是个好主意吗?我意识到这部分是主观的,但是很想听到别人的意见,更重要的是,这种情景被认为是最佳实践。

1 个答案:

答案 0 :(得分:2)

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

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

应用程序仅与接口耦合,一个存储库可以实现多个接口。此外,您可以使用不同的具体存储库使用相同的数据库。回购的要点不是每个实体都有一个回购,它是为应用程序提供一个接口,以便从生存中获得所需的内容。你如何构建INSIDE持久性的东西,这是一个不同的故事。

所以,至少作为一个实验尝试重新定义repo接口以直接返回app需要它的对象,忽略哪个是实体,哪个对象是另一个对象的一部分等等。

然后开始实施具体的回购。请记住,您拥有的应用程序需要的模型数量。只有在琐碎的情况下才有一个模型可以统治所有