Peasy.net之并发处理

BusinessServiceBase是ServiceBase的自定义实现,提供了额外的独特功能

首先,创建一个业务服务,该业务服务必须继承BusinessServiceBase,同时要履行三个合同义务:
1,创建一个DTO,你的DTO将定义一个需要被指定为TKey通用参数的ID属性。可以让你的DTO实现IVersionContainer来参与并发处理

2,创建一个数据代理实现IServiceDataProxy<T, TKey>,或通过创建从一个继承的数据代理这些类。

3,创建一个继承BusinessServiceBase的类,分别指定DTO(T)和ID(TKey),作为泛型类型参数,并要求数据代理作为构造函数参数,并将其传递给基类构造函数

例如,

public class BusinessServiceBaseMock : BusinessServiceBase<Person, long>      //公共类
{
public BusinessServiceBaseMock(IServiceDataProxy<Person, long> dataProxy) : base(dataProxy)   //base是基类,这表示把构造函数的参数传递给基类构造函数,
{
}
}

IServiceDataProxy<Person, long>必须将必需的构造函数参数传递给BusinessServiceBase的构造函数。

并发处理:

并发处理确保对数据存储的更新不会破坏其他用户所做的更改。BusinessServiceBase通过first-write-wins方案支持并发处理。

通过创建BusinessServiceBase的具体实现并使依赖的DTO实现IVersionContainer,可以轻松地实现并发处理。   //这是官方解释,其实不太理解

事实上,是这样的,在声明的抽象类中

这是他的具体继承实现类

这个Person里面就继承实现了IVersionContainer

IVersionContainer接口里面声明了Version

BusinessServiceBase将分别覆盖ServiceBase.UpdateServiceBase.UpdateAsync,分别在这里这里提供它自己的实现。这些方法检查提供的DTO是否实现IVersionContainer接口。如果确实如此,则会将该Version值与数据存储中当前的值进行比较。如果版本不同,BusinessServiceBase将引发ConcurrencyException,否则会允许执行流程继续。

BusinessServiceBase抽象类里面重写了Update方法和UpdateAsync方法

这两个方法检查了DTO实体对象是否实现了接口IVersionContainer,如果确实如此,则会将该Version值与数据存储中当前的值进行比较。如果版本不同,BusinessServiceBase将引发ConcurrencyException,否则会允许执行流程继续。

需要注意的是注入到BusinessServiceBase实例中的数据代理必须处理DTO的更新和检索。Version属性可以使并发正常工作。

当你的服务类暴露DTO时,他们可能会泄露很多不应该是可更新的数据。例如,创建和更新日期等时间戳记字段。这些字段虽然对客户有用,但不一定可以由客户更新。状态是另一个很好的例子,因为您可能不希望客户更改这些值,而是希望以自己的工作流或类似形式呈现自己的业务逻辑。

BusinessServiceBase提供了禁止更改DTO某些字段的选择退出支持。这可以通过将System.ComponentModel.DataAnnotations.Editable属性应用于您要在更新过程中选择退出的DTO中的任何属性轻松实现。

BusinessServiceBase将分别覆盖ServiceBase.UpdateServiceBase.UpdateAsync,分别在这里这里提供它自己的实现。这些方法首先从数据存储中查询当前的DTO表示,扫描所提供的DTO参数以查找与该Editable(false)属性一起应用的任何属性,然后将每个属性值恢复为其在数据存储中的当前状态。

将可空的外键属性从0恢复为NULL

在大多数数据库中,由于外键约束,外键值不能为零。由于您有时无法控制客户在处理您的DTO时所做的工作,因此假设客户将无意中修改了DTO的某些数据值,这是一个好主意。

没有指向手指,那里有很多控制工具包,这些工具包往往不能很好的处理空值。这些控件通常喜欢将空值,设置为0,当这些执行后的DTO到达您的执行流水线并且是时候将DTO保存在数据存储中时,您只有外键异常期待。

为了防止发生这种情况,您可以使用PeasyForeignKeyAttribute在您的DTO上应用可空的外键属性。将此属性应用于DTO上的可空的外键属性将确保它们总是在它们包含0值时恢复为值。

可以为空的外键ForeingKeyID与PeasyForeignKey属性一起使用,因此将null在他们包含0在更新期间时设置他们。

PeasyForeignKey其实是这么定义的

Peasy.NET学习之并发问题处理的更多相关文章

  1. 如何才能够系统地学习Java并发技术?

    微信公众号[Java技术江湖]一位阿里Java工程师的技术小站 Java并发编程一直是Java程序员必须懂但又是很难懂的技术内容. 这里不仅仅是指使用简单的多线程编程,或者使用juc的某个类.当然这些 ...

  2. 从源码学习Java并发的锁是怎么维护内部线程队列的

    从源码学习Java并发的锁是怎么维护内部线程队列的 在上一篇文章中,凯哥对同步组件基础框架- AbstractQueuedSynchronizer(AQS)做了大概的介绍.我们知道AQS能够通过内置的 ...

  3. 如何深入学习Java并发编程?

    在讲解深入学习Java并发编程的方法之前,先分析如下若干错误的观点和学习方法. 错误观点1:学习Java编程主要是学习多线程. 这话其实是说明了表面现象,多线程其实还真是并发编程的实现方式,但在实际高 ...

  4. 《Effective Java》 学习笔记 —— 并发

    <Effective Java>第二版学习笔记之并发编程. 第66条 同步访问共享的可变数据 * 关键字synchronized可以保证在同一时刻只有一个线程可以执行某个方法或代码块. * ...

  5. JMeter学习笔记--并发登录测试

    账号密码读取文件 1.设置线程数为30,并发用户量就是30个用户同时登录 2.添加同步定时器 添加 Synchronizing Timer 同步定时器,为了阻塞线程,当线程数达到指定数量,再同时释放, ...

  6. 通过 SingleFlight 模式学习 Go 并发编程

    最近接触到微服务框架go-zero,翻看了整个框架代码,发现结构清晰.代码简洁,所以决定阅读源码学习下,本次阅读的源码位于core/syncx/singleflight.go. 在go-zero中Si ...

  7. Java多线程学习(一)---并发与多线程

    Java并发与多线程 摘要: 1. 并发与并行的区别,何为并发编程,并发编程的优势在哪 2. 多线程.多任务.多进程机制概述 3. 多线程.多任务.多进程机制与编程思想的关系 一.并发 1.1 并发与 ...

  8. [javaSE] 看博客学习java并发编程

    共享性 多线程操作同一个数据,产生线程安全问题 新建一个类ShareData 设计一个int 型的成员变量count 设计一个成员方法addCount(),把count变量++ 在main函数中开启多 ...

  9. 学习Java并发的课程

    https://www.javaspecialists.eu/courses/concurrency.jsp http://www.jconcurrent.com/ javaConcurrentAni ...

随机推荐

  1. 移动端mintUI mt-datetime-picker 组件使用详解

    <mt-datetime-picker v-model="pickerVisible" //绑定的数据值 ref="pickerData" // 点击触发 ...

  2. go 区分指针

    先看一段代码 先放一段代码,人工运行一下,看看自己能做对几题? package main import "fmt" func main() { var a int = 1 var ...

  3. Android Studio javadoc 生成注释文档

    相信大家刚开始写代码的时候就被前辈告知了要养成写注释的好习惯,今天我们来了解一下如何利用我们平时写的注释生成文档,一起来看看吧! 其实注释格式一般如下两种:  /*  *普通多行  *注释  */ / ...

  4. windows线程函数必须为全局函数或者静态函数(转)

    调用CreateThread(...)创建线程时要指定所创建线程的入口函数,此入口函数只能是全局函数或者类的静态成员函数. 全局函数很容易理解,但如果是类的成员函数则必须是静态成员函数,为何, 因为类 ...

  5. python爬虫(2):图片,翻译爬虫

    import urllib.request#urllib.request.urlopen可以传入url或者Request对象#req=urllib.request.Request("http ...

  6. spark编写UDF和UDAF

    UDF: 一.编写udf类,在其中定义udf函数 package spark._sql.UDF import org.apache.spark.sql.functions._ /** * AUTHOR ...

  7. 【JZOJ6433】【luoguP5664】【CSP-S2019】Emiya 家今天的饭

    description analysis 首先可以知道不符合要求的食材仅有一个,于是可以容斥拿总方案数减去选不合法食材的不合法方案数 枚举选取哪一个不合法食材,设\(f[i][j]\)表示到第\(i\ ...

  8. Windows win32 API 类库 硬件

    // 硬件 Win32_Processor, // CPU 处理器 Win32_PhysicalMemory, // 物理内存条 Win32_Keyboard, // 键盘 Win32_Pointin ...

  9. (转载)js引擎的执行过程(二)

    概述 js引擎执行过程主要分为三个阶段,分别是语法分析,预编译和执行阶段,上篇文章我们介绍了语法分析和预编译阶段,那么我们先做个简单概括,如下: 语法分析: 分别对加载完成的代码块进行语法检验,语法正 ...

  10. SQLServer AlwaysOn在阿里云的前世今生

    缘起 早在2015年的时候,随着阿里云业务突飞猛进的发展,SQLServer业务也积累了大批忠实客户,其中一些体量较大的客户在类似大促的业务高峰时RDS的单机规格(规格是按照 内存CPUIOPS 一定 ...