如果需要,您可以这样做。但是,您可能最终会遇到难以实施的存储库实施。你说你想避免为每个模型对象定义一个回购类。这是我不会推荐的另一个极端。通常有一个更好的中间地带。
这里有一本书叫做Domain Driven Design。其建议之一是尝试使用“聚合根”存储库。这是根据其关系将实体组织到组中的位置,然后为每个组创建一个存储库。存储库中的主要实体被称为该组的“聚合根”,并且其他实体“悬挂”它。
例如,假设您的Order实体具有LineItem实体的集合。您只能通过订单访问订单项,因此您不需要单独的LineItemRepository。您可以查询订单,并可以急切或懒惰地加载行项目。订单然后可以具有导航属性到CustomerAccount实体,该实体具有PaymentProfile实体的集合。同样,相同的模式 - 您只需为客户帐户创建回购协议,并且不会直接查询PaymentProfile。通过CustomerAccount查询它。
另外我从你之前的一个问题中知道你正在使用EF。 EF为您管理交易。每次调用SaveChanges时,EF都会在事务中运行它。所以#2并不是一个真正有理由拥有1个巨大的存储库。
更新
至于的UnitOfWork,具有良好的前期设计,您可以在仓库管理UOW很容易地。我们的每个存储库都有一个UnitOfWork对象(基本上封装了EF DbContext)。我们的代码都没有直接构造对象。相反,我们使用Dependency Injection/Inversion of Control容器(Microsoft Unity)自动构建一个UoW,每次由控制器构建一个存储库(同样,使用依赖注入)。
通过将依赖关系生命周期配置为每个请求的一个实例,我们可以确定至少在我们的MVC项目中,每个存储库都获得相同的UoW实例(因此所有存储库都具有相同的DbContext实例)。
<register type="IUnitOfWork" mapTo="CustomDbContext">
<lifetime type="singleton-per-http-context" />
</register>
你能确切说明你会如何对信息库使用的IoC?我非常熟悉IoC容器(ninject)。我只是不确定如何将MyDbContext注入到存储库中。 – 2013-07-10 19:51:20