ASP.NET MVC:有多少个存储库?

我正在使用ASP.NET MVC设计一个网站,对于存储库的确切性质可能有点困惑。

在NerdDinner示例之后,我的站点应该有一个存储库,根据需要提供实体。 但是,我也听说你应该有不同的存储库来处理特定的相关实体集….

在我的网站的情况下,将有许多实体(大约15个表)但大多数都是相关的。 拥有一个包含拉动/更新/删除等所需方法的存储库,或者我应该将它们拆分,这是否可取/可取?

我为每个数据对象创建一个存储库。

例如,一个简单的库数据库可以包含以下存储库:

  • AuthorRepository
  • BookRepository
  • PublisherRepository

我使用的通用存储库对很多实体来说都很丰富。

对于更复杂的一个,我只是根据需要扩展它。 两个世界中最好的。

在域驱动设计中,存在一个规则,即存储库是每个聚合根。 你可以在这里阅读更多相关信息。

我读的越多,我就越认为NerdDinner经常被视为一组良好实践,而绝对不是(参见此处讨论,尤其是NerdDinner存储库)。 这就是为什么人们常常责怪像Oxite这样的其他MS例子( 在这里 :

开发人员会蜂拥而至,赞美它,并盲目接受它作为福音,因为它来自微软(它已经很好了)。 可悲的是,任何采用其精神的开发者都会留下难以控制,无法辨认和难以理解的混乱局面

)。

如果您使用接受类型的通用存储库,那么我认为没有任何理由使用多个类型。

我们使用这样的界面:

public interface IRepository { void Save(ENTITY entity) where ENTITY : Entity; void Delete(ENTITY entity) where ENTITY : Entity; ENTITY Load(int id) where ENTITY : Entity; IQueryable Query() where ENTITY : Entity; IList GetAll() where ENTITY : Entity; IQueryable Query(IDomainQuery whereQuery) where ENTITY : Entity; ENTITY Get(int id) where ENTITY : Entity; IList GetObjectsForIds(string ids) where ENTITY : Entity; void Flush(); } 

然后在这样的代码中使用:

 var returnedObjects = repository.GetAll(); var singleObject = repository.Get(id); 

我想也许是什么是存储库的措辞可能让你感到困惑。 对我而言,存储库是存储数据的数据存储(即; MS SQL数据库)。

在存储库模式之后,我建议为每个数据存储区设置一个存储库。 我的大多数项目都使用MS SQL,因此我为该数据库创建了一个存储库(我喜欢使用Subsonic作为我的DAL / ORM,它还实现了Repositry模式和ActiveRecord模式)然后我为每个表创建了工厂。 这让我包装了Subsonic ActiveREcord类并给了我抽象。

希望有帮助,也许……

您不应该为每个表创建存储库。 正如queen3所说,你应该为每个聚合根创建Repository。 就像,如果Products可以有一个Category,Category Repository应该是一个嵌套的Products类。 遵循域逻辑关系而不是域对象。

Queen3是对的,你可以遵循Aggregate Root理论。 我基本上将我的存储库分组,而不考虑实体,但是它们如何在我正在构建的应用程序中进行逻辑分组。

例如:

 CustomersRepository OrdersRepository ... 

在CustomerRepository中,我将为GetCustomers,GetCustomer,AddCustomer,DeleteCustomer,AddCustomerContact,DeleteCustomerContact设置方法。

在OrdersRepository中,我会为GetOrders,GetOrder,AddOrder,CancelOrder,CloneOrder,AddOrderDetail,DeleteOrderDetail等放置方法。

我倾向于使用每个相关权利组的存储库。 即orderrepository可能有:

订单和OrderDetail。

并且还有另一个,比如客户,客户档案等。

这使存储库类保持整洁。

戴维