首页 > 代码库 > 让实体对象自行决定留存操作类型(增删改)

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


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

实体对象的留存指把对象改变保存回数据存储中,就数据库而言就是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。
其二,初始赋值法,在实体创建时,区分实体是新建抑或加载即可,本文讨论这一方法。
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*/
                }
               
else
                {
                   
if (this.isModified) {return PersistanceMode.Insert;   /* Insert*/
                    }
                   
else
                    {
                       
/* None*/
                    }
                }
            }
           
else
            {
               
if (this.isRemoved)
                {
                   
if (this.isModified)
                    {
                       
return PersistanceMode.Delete;   /* Delete*/
                    }
                   
else
                    {
                       
return PersistanceMode.Delete;   /* Delete*/
                    }
                }
               
else
                {
                   
if (this.isModified)
                    {
                       
return PersistanceMode.Update;   /* Update*/
                    }
                   
else
                    {
                       
/* None*/
                    }
                }
            }
           
return PersistanceMode.None;
        }