一个不算很复杂的BLL层的方法的代码如下。
  我们需要考虑的如下几种情形(以下统计并不完全):
  1、对某些不能重复的字段进行判断,以检查其是否重复。
  2、如果某条记录被其它表引用,则会抛出异常。
  3、如果每次操作多条记录,或者多个表,则需要使用事务。
  4、删除记录时,可能需要将详细记录表的相关记录一并删除。
  5、添加记录时,可能需要将详细记录表的相关记录一并添加。
  6、没有专用于更新某个字段的方法,所以需要先读取整个记录,再更改相应字段,再更新整条记录。
  7、一些情况下,某些方法需要返回一些特别的值。
  8、一些情况下,某些方法缺失。如某些情况下,只有Insert方法,没有Update方法。
  除此之外,由于业务的特殊性,还可能有众多的其它情形需要考虑。因此,在必要的情况下,我们有必要做一些配置,以便于代码的自动生成。当然,先自动生成部分代码,再手工完成其它代码也是一个不错的想法,只是需要注意,防止以后自动生成时覆盖掉以前的手工代码(使用TFS进行代码管理,能有效避免这个失误)。
    1     public void SaveFunction(FunctionInfo functionInfo)
    2     {
    3         Database database = Factory.CreateDatabase();
    4         FunctionDAL dal = new FunctionDAL(database);
    5 
    6         try
    7         {
    8             string faultType = "Record duplicated exception.";
    9             string faultReasonForFunctionName = "Function Name is duplicated.";
   10 
   11             IList listByFunctionName = dal.GetFunctionsByFunctionName(functionInfo.FunctionName);
   12 
   13             if (dal.GetFunctionByFunctionId(functionInfo.FunctionId) == null)
   14             {
   15                 if (listByFunctionName != null)
   16                 {
   17                     throw new FaultException<FaultInfo>(new FaultInfo(faultType, faultReasonForFunctionName), new FaultReason(faultReasonForFunctionName));
   18                 }
   19 
   20                 functionInfo.FunctionId = (new TableDAL(database)).GetTableValueByTableId(TableIdEnum.Function);
   21 
   22                 dal.InsertFunction(functionInfo);
   23             }
   24             else
   25             {
   26                 if ((listByFunctionName == null || (listByFunctionName.Count == 1 && ((FunctionInfo)listByFunctionName[0]).FunctionId == functionInfo.FunctionId)) == false)
   27                 {
   28                     throw new FaultException<FaultInfo>(new FaultInfo(faultType, faultReasonForFunctionName), new FaultReason(faultReasonForFunctionName));
   29                 }
   30 
   31                 dal.UpdateFunctionByFunctionId(functionInfo);
   32             }
   33         }
   34         catch
   35         {
   36             throw;
   37         }
   38         finally
   39         {
   40             database.Connection.Close();
   41         }
   42     }
  由于笔者命名等的规范性,很多规则可以避免需要配置即可生成代码。这里,笔者仅仅配置了需要检查重复的字段。
    1 xml version="1.0" encoding="utf-8" ?>
    2 <root>
    3     <table name="Department" referenced="Department is referenced.">
    4         <item name="DepartmentName" duplicated="Department Name is duplicated." />
    5     table>
    6 root>
  具体的自动生成代码的过程,这里就不列出来了,也不值得列出来,使用了非常多的条件判断,由此这个过程的复杂性可见一斑。请读者自行查看代码。
  BLLToService、ServiceToHost等代码生成器就显得非常简单,笔者就不一一介绍了。