• 让实体对象自行决定留存操作类型(增删改)



    本文中不考虑数据库并发的影响和缓存效率问题。

    实体对象的留存指把对象改变保存回数据存储中,就数据库而言就是INSERT、UPDATE、DELETE。
    1、从数据源加载的实体未发生改变,则不需执行留存操作。
    2、新建的实体留存时执行INSERT。
    3、从数据源加载的实体发生了改变,留存时执行UPDATE。
    4、客户端决定删除某实体时,执行DELETE。

    留存操作的决定者
    1、客户端可以充当留存操作的决定者,在UI层实现,需要客户端根据判断调用不同的增删改方法。不推荐。
    2、(推荐)实体自身也可以充当留存操作的决定者,在领域层实现,这让实体不再是简单的贫血模型,但这样的设计使得系统智能化程度相对较高,UI层只需要简单的调用一个保存方法,不必关心留存的细节。推荐。

    实体对象自行决定留存操作
    1、调用的保存方法

    ModelService.Save(Model model);

    2、保存方法中根据Model的PresistanceMode属性决定留存行为。
    3、Model实现IEntity接口,而PresistanceMode是该接口上的一个只读属性。
    4、PresistanceMode被定义为一个枚举。该定义与IEntity接口定义在一起。

    public enum PersistanceMode { None, Insert, Update, Delete }

    实体留存的判断方法
    1、实体通过三个标记来判断PresistanceMode,这三个标记定义为三个字段。

    protected bool isNew = false;
    protected bool isModified = false;
    protected bool isRemoved = false;

    2、就三者的组合来判断PresistanceMode
    3、isRemoved最简单,可交由客户端设定即可。
    4、isNew相对简单,有两种方法实现。
    其一,查询法,在实体留存时,以实体标识查询数据存储,没找到的设置isNew = true。
    其二,初始赋值法,在实体创建时,区分实体是新建抑或加载即可,实体新建时,设置isNew = true。
    5、isModified比较复杂,有两种方法实现。
    其一,过程法,改变属性通过统一的ChangeProperty方法(过程)来完成,在其中设定isModified值。应完成集合属性的改变属性方法。
    其二,比较法,实体保存初始值,通过比较初始值来判断并设定isModified值。

    实体留存判断的复杂性
    1、实体新建后保存,PresistanceMode.Insert。
    2、实体新建、删除后保存,PresistanceMode.None。
    3、实体新建、修改后保存,PresistanceMode.Insert。
    4、实体新建、修改、删除后保存,PresistanceMode.None。
    5、实体加载、无修改、未删除,保存,PresistanceMode.None。
    6、实体加载、修改后保存,PresistanceMode.Update。
    7、实体加载、修改、删除后保存,PresistanceMode.Delete。
    8、实体加载、无修改、删除后保存,PresistanceMode.Delete。

            public PersistanceMode PersistanceMode
            {
                get { return this.GetPersistanceMode(); }
            }

            /// <summary>
            /// 根据实体字段的值,推断实体的留存方式
           
    /// </summary>
            /// <returns></returns>
            private PersistanceMode GetPersistanceMode()
            {
                if (this.isNew)
                {
                    if (this.isRemoved)
                    {
                        /* None, however isModified. */
                    }
                    else
                    {
                        if (this.isModified)
                        {
                            return PersistanceMode.Insert;   /* Insert */
                        }
                        else
                        {
                            /* None */
                        }
                    }
                }
                else
                {
                    if (this.isRemoved)
                    {
                        return PersistanceMode.Delete;   /* Delete, however isModified. */
                    }
                    else
                    {
                        if (this.isModified)
                        {
                            return PersistanceMode.Update;   /* Update */
                        }
                        else
                        {
                            /* None */
                        }
                    }
                }
                return PersistanceMode.None;
            }

  • 相关阅读:
    动态可配置表单的设计构思
    mysql之视图
    mysql学习之数据备份和恢复
    mysqli操作
    mysql登录出现1045错误修改方法
    mysql之简单的多表查询
    sql优化的方法总结
    mysql语句操作
    linux 批量替换文件内容
    zend framework 数据库操作(DB操作)总结
  • 原文地址:https://www.cnblogs.com/godwithus/p/3867733.html
Copyright © 2020-2023  润新知