我看到的每个存储库模式的例子都涉及一个非常简单的用例 – 一个对象类型和最基本的CRUD操作.然后,存储库经常直接插入MVC控制器.
真实世界的数据访问就是这样.真实世界的数据访问场景可能涉及对象的复杂图形和某种形式的事务包装器.例如,假设我要保存新订单.这涉及写入Order,OrderDetails,Invoice,User,History和ItemStock表.所有这一切都必须进行交易,承诺或回滚.通常我会传递IDbTransaction和IDbConnection之类的东西,并将整个操作捆绑在服务层中.
存储库模式在哪里适合?我错过了什么(也许是工作单位)?是否有比使用通常的固定博客片段更实际的存储库示例?
欣赏任何光线.
解决方法
这是一个非常有争议的话题,但这是我从自己的经历中得到的.
存储库在聚合根目录下工作.例如,如果OrderItem总是作为Order的一部分被检索,并且没有自己的外部订单,那么它将由OrderRepository加载,否则它将拥有自己的存储库.
UnitOfWork是一个重要的概念.让我们说OrderItem是一个聚合根,并有自己的存储库.因此,在创建订单时,OrderManager将在using块中创建一个UnitOfWork工作,初始化OrderItemRepository和OrderRepository,然后提交.
UPDATE
对,就是这样.想象一下 – 在我们的情况下,订单 – 正在插入订单.这需要控制交易并在同一交易中单独输入订单和订单.这不能在存储库级别进行管理.这是存在UnitOfWork概念的唯一原因,该概念被传递到存储库,因此它不拥有或初始化它. UnitOfWork通常在业务层创建.