工作单元的定义是:维护一个受业务事务影响的对象列表,并协调写入更改内容和并发问题的解决方案。
一个业务事务中,可能需要多次修改对象模型,对象模型的修改需要记录到数据库中,当然可以每次对象模型有修改时就将变化记录到数据库中,但是这会产生很多对数据库的调用。而使用工作单元来记录业务事务中对数据库有影响的所有变化,就可以减少对数据库的大量小规模调用。
很显然对象模型的变化,工作单元都必须知道并且记录。所以一旦有变化产生都必须通知工作单元,有三种方式来实现:
1. 调用者注册:
一旦调用者修改了某个对象,就必须向工作单元注册这个修改。
先写一个工作单元接口
package test.hella.unitwork; public interface IUnitOfWork{ void registerAdded(Object entity); void registerChanged(Object entity); void registerRemoved(Object entity); void commit(); }
然后是接口实现:
package test.hella.unitwork; import java.util.ArrayList; import java.util.List; public class UnitOfWork implements IUnitOfWork { private List<Object> newObjects = new ArrayList<Object>(); private List<Object> dirtyObjects = new ArrayList<Object>(); private List<Object> removedObjects = new ArrayList<Object>(); public void registerAdded(Object entity) { newObjects.add(entity); } public void registerChanged(Object entity) { dirtyObjects.add(entity); } public void registerRemoved(Object entity) { removedObjects.add(entity); } public void commit() { insertNew(); updateDirty(); deleteRemoved(); } private void insertNew() { for (Object newObj : newObjects) { //DO insert } } private void updateDirty() { for (Object dirtyObj : dirtyObjects) { //DO update } } private void deleteRemoved() { for (Object removedObj : removedObjects) { //DO delete } } }
调用着的调用方式:
package test.hella.unitwork; public class UnitOfWorkTest { private static final UserRepository userRepository = new UserRepository(); public static void main(String[] args) { User user1 = new User(1,"user1"); IUnitOfWork unitOfWork = new UnitOfWork(); unitOfWork.registerRemoved(user1); User user2 = userRepository.getUser(2); user2.changeName("user2Changed"); unitOfWork.registerChanged(user2); User user3 = userRepository.getUser(3); unitOfWork.registerRemoved(user3); unitOfWork.commit(); } }
2. 对象注册:
对象注册的方式,调用者无需负责注册,注册方法被置于对象方法中。
还以上面的代码距离,此时User对象需要负责注册:
package test.hella.unitwork; public class User { private final long id; private String name; public long getId() { return id; } public User(long id, String name) { this.id = id; this.name = name; } public void changeName(String name, IUnitOfWork unitOfWork) { this.name = name; unitOfWork.registerChanged(this); } }
调用者无需再向工作单元进行注册。很明显看到上例中需要将工作单元传递给User对象,这种传递显得不够简洁,更好的方式是将工作单元放到一个众所周知的地方来解决这个问题,比如java的ThreadLocal。
package test.hella.unitwork; import java.util.ArrayList; import java.util.List; public class UnitOfWork implements IUnitOfWork { private List<Object> newObjects = new ArrayList<Object>(); private List<Object> dirtyObjects = new ArrayList<Object>(); private List<Object> removedObjects = new ArrayList<Object>(); private static ThreadLocal current = new ThreadLocal<UnitOfWork>(); public static void newCurrent() { setCurrent(new UnitOfWork()); } public static void setCurrent(UnitOfWork now) { current.set(now); } public static UnitOfWork getCurrent() { return (UnitOfWork) current.get(); } public void registerAdded(Object entity) { newObjects.add(entity); } public void registerChanged(Object entity) { dirtyObjects.add(entity); } public void registerRemoved(Object entity) { removedObjects.add(entity); } public void commit() { insertNew(); updateDirty(); deleteRemoved(); } private void insertNew() { for (Object newObj : newObjects) { //DO insert } } private void updateDirty() { for (Object dirtyObj : dirtyObjects) { //DO update } } private void deleteRemoved() { for (Object removedObj : removedObjects) { //DO delete } } }
3. 工作单元控制器:
这种方式调用者和DomainObject都无需小心翼翼的记得向工作单元注册变化。工作单元控制所有的数据读取,读取数据之后会产生一个拷贝,提交时按照对象的唯一标识和拷贝的对象进行对比,如果有变化则更新数据库中的数据。
相关推荐
本教程将探讨如何在EF和MVC环境下,利用泛型仓储模式和工作单元模式来实现数据访问层的增删查改操作。 首先,了解仓储模式。仓储模式是Martin Fowler在其著作《企业应用架构模式》中提出的一种设计模式,它提供了一...
Entity Framework Core 3的存储库和工作单元模式实现。如何使用?安装安装Nuget软件包。对逻辑层使用抽象,对基础结构层或整体项目使用抽象。 dotnet add package QD.EntityFrameworkCore.UnitOfWorkdotnet add ...
在本文中,我们将深入探讨如何在ASP.NET MVC项目中结合Entity Framework 6(EF6)、仓储模式和工作单元模式来构建高效的数据访问层。仓储模式是设计模式的一种,它为数据访问提供了一种抽象,而工作单元模式则帮助...
当我们谈论"DapperUnitOfWorkk"时,它是一个结合了Dapper与工作单元模式的实现,旨在为基于Dapper的数据库操作提供更方便的事务管理和上下文控制。 首先,让我们深入理解Dapper。Dapper是由Stack Overflow团队开发...
此示例项目展示了如何结合使用存储库模式和工作单元模式来增强EF Core的功能,提高代码的可重用性和可测试性。 **存储库模式**是一种设计模式,它提供了一种抽象数据访问层的方式,使业务逻辑层可以独立于具体的...
### 工作单元模式的核心职责 - 维护一个事务边界,确保在业务操作中的所有数据库更改作为一个整体提交或回滚。 - 协调跨多个仓储的变更,确保数据一致性。 - 提供方法来开始和结束一个工作单元,比如`...
工作单元模式管理一个事务内的多个数据操作。它跟踪在一个工作单元内所做的所有更改,并在提交时一起应用这些更改。这样可以确保数据的一致性。在Golang中,一个工作单元通常是一个对象,该对象持有一个或多个存储...
开发者核心持久性持久性库提供Entity Framework Core和存储库和工作单元模式的内存中实现(通过HashSet)。 针对.NET 5.0快速开始通过实现IEntity或IEntity接口或通过从EntityBase基类继承来定义您的实体。 public ...
这是一个简单的 ASP.NET MVC Web 应用程序,展示了如何启动和运行一个简单的 Web 应用程序,该应用程序遵循使用 ASP.NET MVC、实体框架和 Autofac 实现的通用存储库和工作单元模式。 Moq 用于单元测试。 Test 项目...
一个简单的、轻量级、兼容移动端的基于Unit of work工作单元模式的ASP.net MVC快速开发框架。Demo: admin 123456Admin Theme: Wiki: 欢迎使用本系统版权所有:袁圈 ()项目代码:友情提示1.没有看到左侧菜单,请点击...
工作单位Microsoft.EntityFrameworkCore的插件,用于支持存储库,工作单元模式以及支持分布式事务的多个数据库。支持MySQL多个数据库/表分片实际上,在MySQL中,模式与数据库同义。 您可以在MySQL SQL语法中用关键字...
Foundation - .NET MVC 样板 Visual Studio 解决方案 (alpha)介绍.NET MVC 样板解决方案包含工作单元模式、Autofac 依赖项注入和一键式数据库设置,包括基于 Altairis.Web.Security 的角色和成员资格。如何使用只需...
这是我对存储库和工作单元模式的看法。 起初我试图尽可能地与数据访问无关,但是这在其应用程序中适得其反,所以我决定只关注 Dapper/DapperExtensions。 理想情况下,您可以在一个地方简单地更改底层实现(例如...
其中,事务处理和工作单元模式是ABP框架中的两个重要概念,它们对于确保数据的一致性、提高应用程序性能具有重要作用。 #### 二、事务处理的重要性 事务处理是指一组操作作为一个整体被执行的过程。在这些操作中,...
这是Dapper带有存储库模式的工作单元的简单示例。 我创建此仓库是因为我无法使用Dapper的工作单元来找到仓库模式。希望这将有助于其他希望以此方式使用Dapper的人,并以此作为入门指南。有很多方法可以实现此目的,...
ASP.NET Core-MongoDB存储库和工作单元模式 示例应用程序-此演示演示了如何为MongoDB .Net驱动程序简单实现存储库和工作单元模式。 服务器端:ASP.NET Core 先决条件网络核心3.1 技术: ASP.NET核心昂首阔步...
自述文件该应用程序实现工作单元,存储库模式和Entity Framework Core 3.1 有和没有依赖注入的示例安装dotnet restorecd srccd Example.Persistence对于Winform NET 5 添加Microsoft.EntityFrameworkCore.Design v...
工作单元(UnitOfWork)模式在软件开发中是一种设计模式,它主要用于管理数据库的事务。在.NET环境中,尤其是在使用ORM(对象关系映射)框架如Entity Framework时,UnitOfWork模式扮演着重要的角色。这个模式允许...
1 “Blog.Core-master”示例程序的缺陷1、当前程序通过工作单元模式与仓储模式结合的方式通过“SqlSugar”中间件实现了当前程序与数据库表的CURD交互操作,但在当前实际的工程实现上工作单元模式已经逐渐的式微,而...