在系统开发前都会制定代码编写规则,这样能够很好的规范系统代码编写,提高代码可阅读性和可维护性。同样在编写业务逻辑上自己也会定义基础处理规则,这样就能够清楚明确系统中所有业务逻辑的处理过程(主要也是方便对业务逻辑的理解和维护);在实际情况中业务逻辑的规则是比较复杂和多变的,似乎制定一个统一的规则比较难。但是事实上可以采用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;