ASP.NET MVC - 使用 UnitOfWork

标签 asp.net asp.net-mvc separation-of-concerns unitofworkapplication

我目前正在开发一个由 6 层组成的网络应用程序:

  • Web(引用 ViewModel 和 Controller )
  • ViewModel
  • Controller
  • 服务(引用数据和实体)
  • 数据(引用实体)
  • 实体

我想要实现一个“UnitOfWork”模式,因此我有一个由 DI 为该作业注入(inject)的类,这使得当我'时可以在 Controller 的 actionresult 中执行 .commit()我已完成数据库操作。

现在我的问题是……这个 UnitOfWork 类应该放在哪里?目前它在我的数据层中,但需要 Controller 层引用数据层和服务层,这在我看来很奇怪......我应该将 UnitOfWork 类/接口(interface)移至服务层并使用 DI 吗?

最佳答案

除非您在数据层中使用存储库模式,否则您就是在浪费时间。

UoW 的重点是处理多个存储库实例之间的更改,这是通过以下方式完成的:

  1. 工作单元源自实际的底层上下文(DataContext - L2SQL、ObjectContext/EF)
  2. 存储库在其构造函数中包含一个工作单元。

工作单元做两件事:

  1. 有一个 Commit() 方法
  2. 将底层对象/实体集公开到存储库。

完成所有设置有点棘手,但是一旦完成,流程应该如下所示:

  1. Controller 获取 DI 的服务和工作单元(均通过接口(interface))
  2. Controller 调用服务上的方法(“CustomerServices.AddOrder()”)
  3. 服务调用存储库上的方法
  4. 存储库对“Order”对象/实体集调用“Add”方法
  5. Controller 提交工作单元

本质上,每一层在其构造函数中都采用“下一层”的实例。 一切都应该是DI'ed和界面驱动的。 UoW 不依赖任何东西 - 但存储库依赖它来持久保存“内部存储器”(ORM),然后 UoW“Commit”会将更改推送到数据库(基本上包装了“SaveChanges”方法)。

由于工作单元是基础设施/持久性/数据库/事务问题,因此它应该进入您的数据层。只能由 Controller 引用。

关于ASP.NET MVC - 使用 UnitOfWork,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4938040/

相关文章:

asp.net - 来自 url 的 SPA 不在 root 上(并且包括 filename.aspx)路由和刷新

ASP.NET 后台工作线程

c# - Principal Role App 引用的属性必须与 EntityType 的键完全相同

javascript - 我希望在 Razor 函数中调用 JS 函数

jQuery Ajax : Reference MVC controller url from App root

django - 对 Django + AngularJS 现实世界示例进行分类

asp.net - 如何在asp.net MVC应用程序中为不同的 Controller 指定不同的端口?

asp.net-mvc - 将 ASP.NET MVC 应用程序与 Entity Framework 解耦

asp.net-mvc - 'CreateMap' 语句应该去哪里?

c# - 如何向 Request.Form 集合添加值