我目前正在开发一个由 6 层组成的网络应用程序:
- Web(引用 ViewModel 和 Controller )
- ViewModel
- Controller
- 服务(引用数据和实体)
- 数据(引用实体)
- 实体
我想要实现一个“UnitOfWork”模式,因此我有一个由 DI 为该作业注入(inject)的类,这使得当我'时可以在 Controller 的 actionresult 中执行 .commit()我已完成数据库操作。
现在我的问题是……这个 UnitOfWork 类应该放在哪里?目前它在我的数据层中,但需要 Controller 层引用数据层和服务层,这在我看来很奇怪......我应该将 UnitOfWork 类/接口(interface)移至服务层并使用 DI 吗?
最佳答案
除非您在数据层中使用存储库模式,否则您就是在浪费时间。
UoW 的重点是处理多个存储库实例之间的更改,这是通过以下方式完成的:
- 工作单元源自实际的底层上下文(DataContext - L2SQL、ObjectContext/EF)
- 存储库在其构造函数中包含一个工作单元。
工作单元做两件事:
- 有一个
Commit()
方法 - 将底层对象/实体集公开到存储库。
完成所有设置有点棘手,但是一旦完成,流程应该如下所示:
- Controller 获取 DI 的服务和工作单元(均通过接口(interface))
- Controller 调用服务上的方法(“CustomerServices.AddOrder()”)
- 服务调用存储库上的方法
- 存储库对“Order”对象/实体集调用“Add”方法
- Controller 提交工作单元
本质上,每一层在其构造函数中都采用“下一层”的实例。 一切都应该是DI'ed和界面驱动的。 UoW 不依赖任何东西 - 但存储库依赖它来持久保存“内部存储器”(ORM),然后 UoW“Commit”会将更改推送到数据库(基本上包装了“SaveChanges”方法)。
由于工作单元是基础设施/持久性/数据库/事务问题,因此它应该进入您的数据层。只能由 Controller 引用。
关于ASP.NET MVC - 使用 UnitOfWork,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4938040/