EntityModel 系列之管理后台 在数据保存时进行扩展操作

ApiControler中的保存行为解析

  1. AddNew流程
    系统接收请求→构造FormConvert→构造Data对象→ReadFormData方法填充数据→Business.AddNew→返回操作结果

这两种用户调用的保存操作,数据的__IsFromUser属性会被设置为true,以便识别行为类型

  1. Update流程为 :
    系统接收请求→构造FormConvert对象→通过ID读取数据库最新数据→ReadFormData方法填充数据→Business.Update→返回操作结果

我们采用无并发处理方式,所以在Update操作时会先通过ID读取数据库最新数据 。

  1. FormConvert类
    在保存操作(AddNew\Update)时构造,在ReadFormData重载方法中使用。FormConvert类提供ToXXX族方法方便地获取表单的值

内部也是将Form表单数据预读到Arguments属性

  1. 重载ReadFormData方法填充数据
    数据填充的方法重要但很无趣,所以默认这部分工作由设计器生成代码完成。

为了让你能抄到生成的代码,所以生成在代码在的DefaultReadFormData方法中。

  1. 如何自定义控制
    当你感觉设计器生成的代码不够用时,你可以在ReadFormData中直接手工处理。我们建议可用的代码直接复制过来,防止手贱打错字而出现BUG。

在Business类中操作

  1. 打开生成的BL代码类

在DataModel项目中的Business目录下,一般文件名为 [实体名称]BusinessLogic.cs

  1. 删除代码生成器写入标记(特别重要)
  2. 根据你需要,重载如下方法的一或多个
/// <summary>
///     保存前的操作
/// </summary>
/// <param name="data">数据</param>
/// <param name="isAdd">是否为新增</param>
/// <returns>如果为否将阻止后续操作</returns>
protected override bool OnSaving(DemoEntityData data, bool isAdd)
{
     return base.OnSaving(data, isAdd);
}

/// <summary>
///     保存完成后的操作
/// </summary>
/// <param name="data">数据</param>
/// <param name="isAdd">是否为新增</param>
/// <returns>如果为否将阻止后续操作</returns>
protected override bool OnSaved(DemoEntityData data, bool isAdd)
{
     return base.OnSaved(data, isAdd);
}
/// <summary>
///     被用户编辑的数据的保存后操作
/// </summary>
/// <param name="data">数据</param>
/// <param name="isAdd">是否为新增</param>
/// <returns>如果为否将阻止后续操作</returns>
protected override bool LastSavedByUser(DemoEntityData data, bool isAdd)
{
    return base.LastSavedByUser(data, isAdd);
}

/// <summary>
///     被用户编辑的数据的保存前操作
/// </summary>
/// <param name="data">数据</param>
/// <param name="isAdd">是否为新增</param>
/// <returns>如果为否将阻止后续操作</returns>
protected override bool PrepareSaveByUser(DemoEntityData data, bool isAdd)
{
    return base.PrepareSaveByUser(data, isAdd);
}

按注释说明选择在对应的方法中填写代码。

举个例子

需求

数据在保存前,校验名称是否存在,如果存在,则保存失败

编码

/// <summary>
///     保存前的操作
/// </summary>
/// <param name="data">数据</param>
/// <param name="isAdd">是否为新增</param>
/// <returns>如果为否将阻止后续操作</returns>
protected override bool OnSaving(DemoEntityData data, bool isAdd)
{
    //扩展代码
    bool existName = isAdd
        ? Access.Any(p => p.Name == data.Name)
        : Access.Any(p => p.Name == data.Name && p.Id != data.Id);
    if (existName)
    {
        //Api返回时会取这两个值来写入错误信息中
        GlobalContext.Current.LastState = ErrorCode.LogicalError;
        GlobalContext.Current.LastMessage = "名称已存在,保存失败";
        return false;
    }
    //扩展代码结束
    return base.OnSaving(data, isAdd);
}

说明:

  1. Save已在基类中统一封装,所以我们通过对GlobalContext.Current的两个上下文属性来赋错误值.
  2. 尽量保持对基方法的调用.以提高代码的身后兼容.

猜你喜欢

转载自blog.csdn.net/longhutian/article/details/88184690