制定统一业务逻辑基础规则
在系统开发前都会制定代码编写规则,这样能够很好的规范系统代码编写,提高代码可阅读性和可维护性。同样在编写业务逻辑上自己也会定义基础处理规则,这样就能够清楚明确系统中所有业务逻辑的处理过程(主要也是方便对业务逻辑的理解和维护);在实际情况中业务逻辑的规则是比较复杂和多变的,似乎制定一个统一的规则比较难。但是事实上可以采用Command模式制定业务逻辑的基础规则,用于描述业务逻辑执行的切入点;对于一些复杂的规则(如业务流程处理等)可以通过Template Method模式对基础规则进行扩展;这种制定规则只适用于单一职责业务逻辑,对于一些多职责业务逻辑只能选择别的方式。
在软件开发中解决问题的方法很多,虽然都是解决同一问题但不同人实现的方法却可以完全不一样;因此以下描述的内容只是本人在项目制定的业务逻辑基础规则。在系统设计时会制定以下两种业务逻辑的基础规则:
1) 多职责规则;用于业务数据的基础操作,主要是添加,修改和删除。
2) 单一职责规则;用于扩展出查询、统计和复杂处理的基础规则(实际上是规范所有单一职责的业务逻辑)。
多职责规则
这种规则主要用于规范基于业务基础操作操作的业务逻辑;职责包括对业务数据进行添加,修改和删除等操作。这种规则在数据库处理系统中比较常见,其行为也比较统一。在制定这种规则相对比较简单,制定相关职责方法即可:
/// <summary>
/// 模型操作规则
/// </summary>
public interface IModelLogic
{
/// <summary>
/// 添加模型对象
/// </summary>
void Add();
/// <summary>
/// 删除模型对象
/// </summary>
void Delete();
/// <summary>
/// 更新模型对象
/// </summary>
void Edit();
}
为了更适合应用,可以实现IModelLogic建立一个方便处理的Adapter
public class ModelLogicAdapter:IModelLogic
{
private object mIndex = null;
/// <summary>
/// 获取模型对象相关索引
/// </summary>
private object mModelObj = null;
protected object Index
{
get
{
return mIndex;
}
}
/// <summary>
/// 获取当前模型对象
/// </summary>
protected object ModelObj
{
get
{
return mModelObj;
}
set
{
mModelObj = value;
}
}
public ModelLogicAdapter()
{
}
public ModelLogicAdapter(object index)
{
mIndex = index;
OnLoadModel(mIndex);
}
#region IModelLogic 成员
/// <summary>
/// 加载模型对象
/// 派生类重写
/// </summary>
/// <param name="index">模型相关索引</param>
protected virtual void OnLoadModel(object index)
{
}
/// <summary>
/// 更新当前模型对象
/// </summary>
public void Add()
{
// TODO: 添加 ModelLogicAdapter.Add 实现
CheckModule();
OnAdd();
}
protected virtual void OnAdd()
{
DAOContext.Add(ModelObj);
}
/// <summary>
/// 删除当前模型对象
/// </summary>
public void Delete()
{
// TODO: 添加 ModelLogicAdapter.Delete 实现
CheckModule();
OnDelete();
}
protected virtual void OnDelete()
{
DAOContext.Delete(ModelObj);
}
/// <summary>
/// 编辑当前模型对象
/// </summary>
public void Edit()
{
// TODO: 添加 ModelLogicAdapter.Edit 实现
CheckModule();
OnEdit();
}
protected virtual void OnEdit()
{
DAOContext.Edit(ModelObj);
}
#endregion
private void CheckModule()
{
if(ModelObj == null)
throw(new LogicException(TipMessage.MODELOGIC_ERROR_MODELOBJECT_ISNULL));
}
/// <summary>
/// 获取相关索引方法
/// </summary>
/// <param name="table">实体相关表名称</param>
/// <returns>索引值</returns>
protected int GetRecordIndex(string table)
{
lock(this.GetType())
{
int index=0;
System.Collections.IList list = (DBMapping.TablePK.TableName== table).List();
TablePK item;
if(list.Count ==0)
{
index =1;
item = new TablePK();
item.TableName = table;
item.RecordIndex = index;
DBMapping.TablePK.Insert(item);
}
else
{
item = (TablePK )list[0];
item.RecordIndex++;
index = item.RecordIndex;
DBMapping.TablePK.Update(item);
}
return index;
}
}
}
ModeLogicAdapter在原有基础上引入了Template Method模式进行了一个小小的扩展,规定相关行为都通过OnXXX方法去描述执行;基于规则的派生类就必须通过重写OnXXX方法来编写具体操作行为,对于一些共性的行为可以统一编写在相关职责方法中。
具体应用
/// <summary>
/// 用户信息业务规则操作对象
/// </summary>
public class UserLogic : ModelLogicAdapter
{
public UserLogic()
{
}
public UserLogic(string usercode):base(usercode){}
public Entities.SysUser UserItem
{
get
{
return (Entities.SysUser)ModelObj;
}
set
{
ModelObj = value;
}
}
protected override void OnLoadModel(object index)
{
ModelObj = DBMapping.SysUser.GetByIndex((string)Index);
}
protected override void OnAdd()
{
if((DBMapping.SysUser.UserCode == UserItem.UserCode).Count() >0)
{
throw(new LogicException(TipMessage.USERLOGIC_ERROR_HAVERECORD));
}
base.OnAdd ();
}
}
单一职规则
由于这种规则的情况非常多(包括:查询业务逻辑、统计业务逻辑和流程处理等;事实所有单一职责的业务规则都从此规则派生下来)因此在制定时要非常简单不能掺杂过多的东西;通过Command模式来规范业务逻辑处理的入口点,当面临处理很多节点时可以通过Template Method模式进行扩展。
制定基础规则
/// <summary>
/// 基础规则接接口
/// 用于描述业务逻辑执行点
/// </summary>
public interface IBaseLogic
{
void Execute();
}
扩展出基于条件的业务逻辑规则(常用于数据查询和数据统计)
/// <summary>
/// 条件描述接口
/// </summary>
public interface IFilter
{
/// <summary>
/// 获取条件表达式对象
/// </summary>
/// <returns>条件表达式对象</returns>
HFSoft.Data.Expressions.IExpression GetFilter();
}
/// <summary>
/// 基于条件业务逻辑描述规则
/// </summary>
public interface IFilterLogic:IBaseLogic
{
/// <summary>
/// 获取或设置条件对象
/// </summary>
IFilter Filter
{
get;
set;
}
}
基于条件规则的具体应用
/// <summary>
/// 用户查询逻辑类
/// </summary>
public class UserQuery:IFilterLogic
{
public UserQuery()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
private System.Collections.ArrayList mItem;
public System.Collections.ArrayList Items
{
get
{
return mItem;
}
}
#region IFilterLogic 成员
public void Execute()
{
// TODO: 添加 UserQuery.Execute 实现
mItem =(System.Collections.ArrayList) Filter.GetFilter().List();
}
private IFilter mFilter;
public IFilter Filter
{
get
{
// TODO: 添加 UserQuery.Filter getter 实现
if(mFilter == null)
return new UserFilter();
return mFilter;
}
set
{
// TODO: 添加 UserQuery.Filter setter 实现
mFilter = value;
}
}
#endregion
[Serializable]
public class UserFilter:FilterAdapter
{
public override HFSoft.Data.Expressions.IExpression GetFilter()
{
HFSoft.Data.Expressions.Expression exp = new HFSoft.Data.Expressions.Expression();
exp.Table = DBMapping.SysUser;
return exp;
}
}
}
制定简单流程规则
/// <summary>
/// 基础流程规则
/// </summary>
public abstract class FlowBase:IBaseLogic
{
public FlowBase()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
#region IBaseLogic 成员
/// <summary>
/// 流程执行点
/// </summary>
public void Execute()
{
// TODO: 添加 FlowBase.Execute 实现
OnEnd();
}
/// <summary>
/// 加载流程所需要数据
/// </summary>
protected abstract void OnInit();
/// <summary>
/// 流程处理过程
/// </summary>
protected abstract void Flowing();
/// <summary>
/// 流程处理结束过程
/// </summary>
protected abstract void OnEnd();
#endregion
}
以上是在项目开发过程制定的业务逻辑基础处理规则,有兴趣的朋友发表一下自己的看法或自己是如何制定相关规则的。