制定统一业务逻辑基础规则

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

         }

         /// <summary>

         /// 加载流程所需要数据

         /// </summary>

         protected abstract void OnInit();

         /// <summary>

         /// 流程处理过程

         /// </summary>

         protected abstract void Flowing();

         /// <summary>

         /// 流程处理结束过程

         /// </summary>

         protected abstract void OnEnd();

         #endregion

     }

 

以上是在项目开发过程制定的业务逻辑基础处理规则,有兴趣的朋友发表一下自己的看法或自己是如何制定相关规则的。

posted on 2006-09-04 22:18  henry  阅读(2534)  评论(3编辑  收藏  举报

导航