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

时间:2009-09-24 16:15:20

标签: c# .net asp.net-mvc repository nerddinner

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

遵循NerdDinner示例,我的网站应该有一个存储库,可以根据需要提供实体。但是,我也听说你应该有不同的存储库来处理特定的相关实体集....?

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

8 个答案:

答案 0 :(得分:8)

我使用通用存储库,这对很多实体来说都很充实。

对于一个更复杂的问题,我只需扩展即可。两个世界中最好的。

答案 1 :(得分:8)

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

我读的越多,我就越认为NerdDinner经常被视为良好实践的集合,而绝对不是(请参阅here讨论特别是NerdDinner存储库)。这就是为什么人们常常责怪其他MS示例,例如Oxite(和here

  

开发人员会蜂拥而至,赞美   它,并盲目地接受它作为福音   因为它来自微软(它是   已经很好了)。可悲的是,任何   采用其精神意志的开发者   留下一个不可靠的,   不可测试和难以理解的混乱

)。

答案 2 :(得分:5)

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

我们使用这样的界面:

public interface IRepository
{
    void Save<ENTITY>(ENTITY entity)
        where ENTITY : Entity;

    void Delete<ENTITY>(ENTITY entity)
        where ENTITY : Entity;

    ENTITY Load<ENTITY>(int id)
        where ENTITY : Entity;

    IQueryable<ENTITY> Query<ENTITY>()
        where ENTITY : Entity;

    IList<ENTITY> GetAll<ENTITY>()
        where ENTITY : Entity;

    IQueryable<ENTITY> Query<ENTITY>(IDomainQuery<ENTITY> whereQuery)
        where ENTITY : Entity;

    ENTITY Get<ENTITY>(int id) where ENTITY : Entity;

    IList<ENTITY> GetObjectsForIds<ENTITY>(string ids) where ENTITY : Entity;

    void Flush();
}

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

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

答案 3 :(得分:2)

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

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

希望有帮助,也许......

答案 4 :(得分:2)

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

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

  • AuthorRepository
  • BookRepository
  • PublisherRepository

答案 5 :(得分:2)

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

答案 6 :(得分:1)

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

例如:

CustomersRepository
OrdersRepository
...

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

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

答案 7 :(得分:0)

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

订单和OrderDetail。

并且还有另一个,例如,Customer,CustomerProfile等。

这使存储库类保持整洁。

戴维