我正在使用ASP.NET MVC设计一个网站,对于存储库的确切性质可能有点困惑。
遵循NerdDinner示例,我的网站应该有一个存储库,可以根据需要提供实体。但是,我也听说你应该有不同的存储库来处理特定的相关实体集....?
对于我的网站,将会有许多实体(大约15个表),但大多数都是相关的。有一个存储库包含拉动/更新/删除等所需的所有方法,或者我应该拆分它们,这是否可取/可取?
答案 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)
我为每个数据对象创建一个存储库。
例如,一个简单的库数据库可以包含以下存储库:
答案 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等。
这使存储库类保持整洁。
戴维