Peasy.NET学习之并发问题处理

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其实是这么定义的

猜你喜欢

转载自www.cnblogs.com/jiuyueBlog/p/9152208.html