我在WCF服务中有以下接口:
IProductRepository
IFieldRepository
IFieldValueRepository
ICategoryRepository
我在名为DatabaseRepository
的单独项目中实施了这些内容,而Product
,Field
,FieldValue
和Category
都位于共享的公共库中服务和存储库项目之间。
产品包含字段,而字段又包含FieldValues。我不喜欢我的服务构造函数有4个存储库传入的想法,所以我也有IGlobalRepository
,其中包含每个其他存储库的属性。我通过将IGlobalRepository
的具体实现传递给构造函数来实例化我的服务,使用基于Ninject约定的绑定来为我在IIS中托管服务时处理这个问题。
因此,在我的网络服务GetProductsByCategory
上看起来像这样:
private IGlobalRepository Repo { get; set; }
public IEnumerable<Product> GetProductsByCategory(int CategoryID){
return Repo.ProductRepository.GetByCategory(int CategoryID);
}
这一切都很好,除了产品有字段,字段有值。这是否意味着我需要将IFieldRepository
和IFieldValueRepository
的具体实现传递给Repo.ProductRepository
?
我确信有人会建议ProductRepository
也应该负责获取字段数据,但是我将它放在一个单独的存储库中,以便我可以获取独立于它们所附加产品的字段。
在我开始采用存储库模式之前,我只需要在Field或FieldValue上调用静态方法,以获得我需要的东西。绕过存储库似乎是一种不那么优雅的工作方式。
现在问我的实际问题:
全球存储库是个好主意吗?我意识到这部分是主观的,但是很想听到别人的意见,更重要的是,这种情景被认为是最佳实践。
答案 0 :(得分:2)
我认为全球存储库不是一个好主意。
您应该根据用途创建存储库定义。所以是的,产品回购应该返回所有必需的数据,它与FieldRepo或其他回购无关。
应用程序仅与接口耦合,一个存储库可以实现多个接口。此外,您可以使用不同的具体存储库使用相同的数据库。回购的要点不是每个实体都有一个回购,它是为应用程序提供一个接口,以便从生存中获得所需的内容。你如何构建INSIDE持久性的东西,这是一个不同的故事。
所以,至少作为一个实验尝试重新定义repo接口以直接返回app需要它的对象,忽略哪个是实体,哪个对象是另一个对象的一部分等等。
然后开始实施具体的回购。请记住,您拥有的应用程序需要的模型数量。只有在琐碎的情况下才有一个模型可以统治所有