首页 > 代码库 > 让实体对象自行决定留存操作类型(增删改)
让实体对象自行决定留存操作类型(增删改)
本文中不考虑数据库并发的影响和缓存效率问题。
实体对象的留存指把对象改变保存回数据存储中,就数据库而言就是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;
}