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


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

实体对象的留存指把对象改变保存回数据存储中,就数据库而言就是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;
        }

原文地址:https://www.cnblogs.com/godwithus/p/3867733.html