.net中型系统 第二章 业务逻辑类模板设计之三

.net中型系统 第二章 业务逻辑类模板设计之三

前言回顾

前面一章已经讲解了BLL.cst、IBLL.cst文件、BLLCriterion.cst等文件里面的内容,主要是业务实际逻辑处理的模板生成。
本章会继续讲后面的目录内容,让我们继续看下去吧

讲解

接下来会继续讲解业务服务代理层,业务服务层的生成模板。
其中的业务服务代理层主要是生成承接业务服务层的业务操作,目的是灵活性强,可以随时变更业务服务层,随时根据业务的变化来调整,可以单独拎出来部署,从而实现解耦的效果
业务服务层模板主要就是生成一些业务性上的操作,通过调用业务逻辑层,来实现数据库的增删改查等操作

Services

1、IServices.cst文件:业务代理接口模板

<%@ CodeTemplate Language="C#" TargetLanguage="C#" Description="Generates a very simple business object." %>
<%@ Property Name="SourceTable" Type="SchemaExplorer.TableSchema" Category="Context" Description="Table that the object is based on." %>
<%@ Property Name="TablePrefix" Type="System.String" Default="User_" Category="2. Options"
	Description="If this prefix is found at the start of a table name, it will be stripped off." %>
    <%@ Property Name="namespaceName" Type="System.String" Default="YSS.Users" Category="2. Options"
	Description="If this prefix is found at the start of a table name, it will be stripped off." %>
<%@ Assembly Name="SchemaExplorer" %>
<%@ Assembly Name="System.Data" %>
<%@ Import Namespace="SchemaExplorer" %>
<%@ Import Namespace="System.Data" %>
using Common.Model;
using Common.Utils;
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks;

namespace <%=namespaceName%>.Services.IServices
{
    /// <summary>
    /// <%=GetTableTitle() %>
    /// </summary>
    public interface I<%=GetClassName(SourceTable) %>Service : IDisposable
    {
        /// <summary>
        /// 新增
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [OperationContract]
        Result<DTO.<%=GetClassName(SourceTable) %>Info> Add(DTO.<%=GetClassName(SourceTable) %>Info model);
        /// <summary>
        /// 修改
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [OperationContract]
        Result<DTO.<%=GetClassName(SourceTable) %>Info> Update(DTO.<%=GetClassName(SourceTable) %>Info model);
        <%if(SourceTable.HasPrimaryKey) {%>
        /// <summary>
        /// 删除
        /// </summary>
        <%=GetPrimaryKeysTitle(SourceTable) %>
        /// <returns></returns>
        [OperationContract]
        Result Delete(<%=GetPrimaryKeys(SourceTable) %>);
        /// <summary>
        /// 删除多个
        /// </summary>
        <%=GetPrimaryKeysTitleByMore(SourceTable) %>
        /// <returns></returns>
        [OperationContract]
        Result Deletes(<%=GetPrimaryKeysByMore(SourceTable) %>);
        /// <summary>
        /// 跟据主键获取<%=GetTableTitle() %>
        /// </summary>
        <%=GetPrimaryKeysTitle(SourceTable) %>
        /// <returns></returns>
        [OperationContract]
        Result<DTO.<%=GetClassName(SourceTable) %>Info> GetModel(<%=GetPrimaryKeys(SourceTable) %>);
        <%}%>
        /// <summary>
        /// 获取<%=GetTableTitle() %>列表
        /// </summary>
        /// <param name="criterion">条件</param>
        /// <returns></returns>
        [OperationContract]
        Result<PagingDto<DTO.<%=GetClassName(SourceTable) %>Info>> GetList(Criterion.<%=GetClassName(SourceTable) %>Criterion criterion);
    }
}
<script runat="template">
public int Index=0;
public void AddIndex(){
    Index=Index+1;
}

public string GetPrimaryKeys(TableSchema table)
{
    System.Text.StringBuilder result=new System.Text.StringBuilder();
    foreach(ColumnSchema key in  this.SourceTable.PrimaryKey.MemberColumns)
    {
        result.AppendFormat("{0} {1},",GetCSharpVariableType(key),key.Name);
    }
    return result.ToString().Trim(',');
}
public string GetPrimaryKeysTitle(TableSchema table)
{
    System.Text.StringBuilder result=new System.Text.StringBuilder();
    foreach(ColumnSchema key in  this.SourceTable.PrimaryKey.MemberColumns)
    {
        result.AppendFormat("/// <param name=\"{0}\">{1}</param>\n",key.Name,key.Description.Replace("\r\n",""));
    }
    return result.ToString().Trim("\n".ToCharArray());
}
public string GetPrimaryKeysByMore(TableSchema table)
{
    System.Text.StringBuilder result=new System.Text.StringBuilder();
    foreach(ColumnSchema key in  this.SourceTable.PrimaryKey.MemberColumns)
    {
        result.AppendFormat("{0}[] {1}s,",GetCSharpVariableType(key),key.Name);
    }
    return result.ToString().Trim(',');
}
public string GetPrimaryKeysTitleByMore(TableSchema table)
{
    System.Text.StringBuilder result=new System.Text.StringBuilder();
    foreach(ColumnSchema key in  this.SourceTable.PrimaryKey.MemberColumns)
    {
        result.AppendFormat("/// <param name=\"{0}s\">{1}集</param>\n",key.Name,key.Description.Replace("\r\n",""));
    }
    return result.ToString().Trim("\n".ToCharArray());
}

public string GetMemberVariableDeclarationStatement(ColumnSchema column)
{
	return GetMemberVariableDeclarationStatement("protected", column);
}

public string GetMemberVariableDeclarationStatement(string protectionLevel, ColumnSchema column)
{
	string statement = protectionLevel + " ";
	statement += GetCSharpVariableType(column) + " " + GetMemberVariableName(column);
	
	string defaultValue = GetMemberVariableDefaultValue(column);
	if (defaultValue != "")
	{
		statement += " = " + defaultValue;
	}
	
	statement += ";";
	
	return statement;
}

public string GetReaderAssignmentStatement(string ReaderName,ColumnSchema column, int index)
{
	/*
	string statement = "if (!reader.IsDBNull(" + index.ToString() + ")) ";
	statement += GetMemberVariableName(column) + " = ";
	
	if (column.Name.EndsWith("TypeCode")) statement += "(" + column.Name + ")";
	
	statement += "reader." + GetReaderMethod(column) + "(" + index.ToString() + ");";
	
	return statement;
	*/
	string statement = "if (ExistsColumn("+ReaderName+",\""+ column.Name +"\") && !Convert.IsDBNull(reader[\"" + column.Name + "\"])) ";
	statement += GetMemberVariableName(column) + " = ";
	
	if (column.Name.EndsWith("TypeCode")) statement += "(" + column.Name + ")";
	
	statement += "reader."+GetReaderMethod(column)+"(reader.GetOrdinal(\"" + column.Name + "\"));";
	
	return statement;
}

public string GetCamelCaseName(string value)
{
	//return value.Substring(0, 1).ToLower() + value.Substring(1);
	return value;
}

public string GetMemberVariableName(ColumnSchema column)
{
	string propertyName = GetPropertyName(column);
	//string memberVariableName = "_" + GetCamelCaseName(propertyName);
	string memberVariableName = GetCamelCaseName(propertyName);
	return memberVariableName;
}

public string GetPropertyName(ColumnSchema column)
{
	string propertyName = column.Name;
	
	if (propertyName == column.Table.Name + "Name") return "Name";
	if (propertyName == column.Table.Name + "Description") return "Description";
	
	if (propertyName.EndsWith("TypeCode")) propertyName = propertyName.Substring(0, propertyName.Length - 4);
	
	return propertyName;
}
		
public string GetMemberVariableDefaultValue(ColumnSchema column)
{
	switch (column.DataType)
	{
		case DbType.Guid:
		{
			return "Guid.Empty";
		}
		case DbType.AnsiString:
		case DbType.AnsiStringFixedLength:
		case DbType.String:
		case DbType.StringFixedLength:
		{
			return "String.Empty";
		}
		default:
		{
			return "";
		}
	}
}

public string GetCSharpVariableType(ColumnSchema column)
{
	if (column.Name.EndsWith("TypeCode")) return column.Name;
	string typeName="object";
	switch (column.DataType)
	{
		case DbType.AnsiString: typeName= "string";break;
		case DbType.AnsiStringFixedLength: typeName= "string";break;
		case DbType.Binary: typeName= "byte[]";break;
		case DbType.Boolean: typeName= "bool";break;
		case DbType.Byte: typeName= "byte";break;
		case DbType.Currency: typeName= "decimal";break;
		case DbType.Date: typeName= "DateTime";break;
		case DbType.DateTime: typeName= "DateTime";break;
		case DbType.Decimal: typeName= "decimal";break;
		case DbType.Double: typeName= "double";break;
		case DbType.Guid: typeName= "Guid";break;
		case DbType.Int16: typeName= "short";break;
		case DbType.Int32: typeName= "int";break;
		case DbType.Int64: typeName= "long";break;
		case DbType.Object: typeName= "object";break;
		case DbType.SByte: typeName= "sbyte";break;
		case DbType.Single: typeName= "float";break;
		case DbType.String: typeName= "string";break;
		case DbType.StringFixedLength: typeName= "string";break;
		case DbType.Time: typeName= "TimeSpan";break;
		case DbType.UInt16: typeName= "ushort";break;
		case DbType.UInt32: typeName= "uint";break;
		case DbType.UInt64: typeName= "ulong";break;
		case DbType.VarNumeric: typeName= "decimal";break;
		default:
		{
			typeName= "__UNKNOWN__" + column.NativeType;break;
		}
	}
    if(column.AllowDBNull && !"string,object".Contains(typeName)){
        typeName+="?";
    }
    return typeName;
}

public string GetReaderConvertMethod(ColumnSchema column)
{
	switch (column.DataType)
	{
		case DbType.Byte:
		{
			return "Convert.ToByte";
		}
		case DbType.Int16:
		{
			return "Convert.ToInt16";
		}
		case DbType.Int32:
		{
			return "Convert.ToInt32";
		}
		case DbType.Int64:
		{
			return "Convert.ToInt64";
		}
		case DbType.AnsiStringFixedLength:
		case DbType.AnsiString:
		case DbType.String:
		case DbType.StringFixedLength:
		{
			return "Convert.ToString";
		}
		case DbType.Boolean:
		{
			return "Convert.ToBoolean";
		}
		case DbType.Guid:
		{
			return "(Guid)";
		}
		case DbType.Currency:
		case DbType.Decimal:
		{
			return "Convert.ToDecimal";
		}
		case DbType.DateTime:
		case DbType.Date:
		{
			return "Convert.ToDateTime";
		}
		case DbType.Binary:
		{
			return "Convert.FromBase64String";
		}
		default:
		{
			return "__SQL__" + column.DataType;
		}
	}
}

public string GetReaderMethod(ColumnSchema column)
{
	switch (column.DataType)
	{
		case DbType.Byte:
		{
			return "GetByte";
		}
		case DbType.Int16:
		{
			return "GetInt16";
		}
		case DbType.Int32:
		{
			return "GetInt32";
		}
		case DbType.Int64:
		{
			return "GetInt64";
		}
		case DbType.AnsiStringFixedLength:
		case DbType.AnsiString:
		case DbType.String:
		case DbType.StringFixedLength:
		{
			return "GetString";
		}
		case DbType.Boolean:
		{
			return "GetBoolean";
		}
		case DbType.Guid:
		{
			return "GetGuid";
		}
		case DbType.Currency:
		case DbType.Decimal:
		{
			return "GetDecimal";
		}
		case DbType.DateTime:
		case DbType.Date:
		{
			return "GetDateTime";
		}
		case DbType.Binary:
		{
			return "GetBytes";
		}
		default:
		{
			return "__SQL__" + column.DataType;
		}
	}
}

public string GetClassName(TableSchema table)
{
    string tableName=table.Name;
    if(tableName.Length>0 && tableName.StartsWith(TablePrefix)){
        return tableName.Remove(0,TablePrefix.Length);    
    }
    else
	{
		return tableName;
	}
}

public string GetSqlDbType(ColumnSchema column)
{
	switch (column.NativeType)
	{
		case "bigint": return "BigInt";
		case "binary": return "Binary";
		case "bit": return "Bit";
		case "char": return "Char";
		case "datetime": return "DateTime";
		case "decimal": return "Decimal";
		case "float": return "Float";
		case "image": return "Image";
		case "int": return "Int";
		case "money": return "Money";
		case "nchar": return "NChar";
		case "ntext": return "NText";
		case "numeric": return "Decimal";
		case "nvarchar": return "NVarChar";
		case "real": return "Real";
		case "smalldatetime": return "SmallDateTime";
		case "smallint": return "SmallInt";
		case "smallmoney": return "SmallMoney";
		case "sql_variant": return "Variant";
		case "sysname": return "NChar";
		case "text": return "Text";
		case "timestamp": return "Timestamp";
		case "tinyint": return "TinyInt";
		case "uniqueidentifier": return "UniqueIdentifier";
		case "varbinary": return "VarBinary";
		case "varchar": return "VarChar";
		default: return "__UNKNOWN__" + column.NativeType;
	}
}

public string GetPrimaryKeyType(TableSchema table)
{
	if (table.PrimaryKey != null)
	{
		if (table.PrimaryKey.MemberColumns.Count == 1)
		{
			return GetCSharpVariableType(table.PrimaryKey.MemberColumns[0]);
		}
		else
		{
			throw new ApplicationException("This template will not work on primary keys with more than one member column.");
		}
	}
	else
	{
		throw new ApplicationException("This template will only work on tables with a primary key.");
	}
}


public override string GetFileName()
{
	return "I"+this.GetClassName(this.SourceTable) + "Service.cs";
}
public string GetTableTitle()
{
  return  this.SourceTable.ExtendedProperties["Title"].Value.ToString();
}
public string GetTableIndex()
{
  return  this.SourceTable.ExtendedProperties["Index"].Value.ToString();
}
</script>

关键点讲解:
(1)、<%=namespaceName%>:在生成的时候,在生成的总文件中所定义的命名空间,会替代所有有该名称的文件数据
(2)、GetTableTitle:获取数据库表定义的标题
(3)、GetClassName:获取表名,并去掉前缀(这里是在项目开发中约定俗成的,可以根据自己项目的实际情况进行相应的更改)
(4)、GetPrimaryKeys,GetPrimaryKeysTitle,GetPrimaryKeysByMore,GetPrimaryKeysTitleByMore:获取表主键的相关信息,可以针对唯一记录做操作
(5)、GetCSharpVariableType:将数据库字段的数据类型转化为c#语法的数据类型

2、ServicesCriterion.cst文件:条件集合模板

<%@ CodeTemplate Language="C#" TargetLanguage="C#" Description="Generates a very simple business object." %>
<%@ Property Name="SourceTable" Type="SchemaExplorer.TableSchema" Category="Context" Description="Table that the object is based on." %>
<%@ Property Name="TablePrefix" Type="System.String" Default="User_" Category="2. Options"
	Description="If this prefix is found at the start of a table name, it will be stripped off." %>
    <%@ Property Name="namespaceName" Type="System.String" Default="YSS.Users" Category="2. Options"
	Description="If this prefix is found at the start of a table name, it will be stripped off." %>
<%@ Assembly Name="SchemaExplorer" %>
<%@ Assembly Name="System.Data" %>
<%@ Import Namespace="SchemaExplorer" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Collections.Generic" %>
using System;
using Common.Utils;

namespace <%=namespaceName%>.Services.Criterion
{
    /// <summary>
    /// <%=GetTableTitle() %>条件
    /// </summary>
    public class <%=GetClassName(SourceTable) %>Criterion : CriterionBase
    {
        <%foreach(var column in SourceTable.Columns){ %>
        <%=CreateCriterionByColumn(column) %>
        <%} %>
    }
}
<script runat="template">
public int Index=0;
public void AddIndex(){
    Index=Index+1;
}
public string CreateCriterionByColumn(ColumnSchema column)
{
    string csharpType=GetCSharpVariableType(column);
    bool flagNull=column.AllowDBNull;
    System.Text.StringBuilder result=new System.Text.StringBuilder();
    switch(csharpType)
    {
        case "DateTime":
        case "DateTime?":
                result.AppendFormat(@"
        /// <summary>
        /// {1}开始
        /// </summary>
        public virtual Nullable<DateTime> {0}Begin {{ get; set; }}
        /// <summary>
        /// {1}结束
        /// </summary>
    	public virtual Nullable<DateTime> {0}End {{ get; set; }}",column.Name,column.Description.Replace("\r\n",""));
            break;
        case "string":
            result.AppendFormat(@"
        /// <summary>
        /// {1}
        /// </summary>
        public virtual string {0} {{ get; set; }}",column.Name,column.Description.Replace("\r\n",""));
            break;
        default:
            result.AppendFormat(@"
        /// <summary>
        /// {1}
        /// </summary>
        public virtual Nullable<{2}> {0} {{ get; set; }}",column.Name,column.Description.Replace("\r\n",""),csharpType.Trim('?'));
            break;
    }
    return result.ToString();
    
}


public string GetCamelCaseName(string value)
{
	//return value.Substring(0, 1).ToLower() + value.Substring(1);
	return value;
}

public string GetMemberVariableName(ColumnSchema column)
{
	string propertyName = GetPropertyName(column);
	//string memberVariableName = "_" + GetCamelCaseName(propertyName);
	string memberVariableName = GetCamelCaseName(propertyName);
	return memberVariableName;
}

public string GetPropertyName(ColumnSchema column)
{
	string propertyName = column.Name;
	
	if (propertyName == column.Table.Name + "Name") return "Name";
	if (propertyName == column.Table.Name + "Description") return "Description";
	
	if (propertyName.EndsWith("TypeCode")) propertyName = propertyName.Substring(0, propertyName.Length - 4);
	
	return propertyName;
}
		
public string GetMemberVariableDefaultValue(ColumnSchema column)
{
	switch (column.DataType)
	{
		case DbType.Guid:
		{
			return "Guid.Empty";
		}
		case DbType.AnsiString:
		case DbType.AnsiStringFixedLength:
		case DbType.String:
		case DbType.StringFixedLength:
		{
			return "String.Empty";
		}
		default:
		{
			return "";
		}
	}
}

public string GetCSharpVariableType(ColumnSchema column)
{
	if (column.Name.EndsWith("TypeCode")) return column.Name;
	string typeName="object";
	switch (column.DataType)
	{
		case DbType.AnsiString: typeName= "string";break;
		case DbType.AnsiStringFixedLength: typeName= "string";break;
		case DbType.Binary: typeName= "byte[]";break;
		case DbType.Boolean: typeName= "bool";break;
		case DbType.Byte: typeName= "byte";break;
		case DbType.Currency: typeName= "decimal";break;
		case DbType.Date: typeName= "DateTime";break;
		case DbType.DateTime: typeName= "DateTime";break;
		case DbType.Decimal: typeName= "decimal";break;
		case DbType.Double: typeName= "double";break;
		case DbType.Guid: typeName= "Guid";break;
		case DbType.Int16: typeName= "short";break;
		case DbType.Int32: typeName= "int";break;
		case DbType.Int64: typeName= "long";break;
		case DbType.Object: typeName= "object";break;
		case DbType.SByte: typeName= "sbyte";break;
		case DbType.Single: typeName= "float";break;
		case DbType.String: typeName= "string";break;
		case DbType.StringFixedLength: typeName= "string";break;
		case DbType.Time: typeName= "TimeSpan";break;
		case DbType.UInt16: typeName= "ushort";break;
		case DbType.UInt32: typeName= "uint";break;
		case DbType.UInt64: typeName= "ulong";break;
		case DbType.VarNumeric: typeName= "decimal";break;
		default:
		{
			typeName= "__UNKNOWN__" + column.NativeType;break;
		}
	}
    if(column.AllowDBNull && !"string,object".Contains(typeName)){
        typeName+="?";
    }
    return typeName;
}

public void CheckParameters(IList<ColumnSchema> columns){
  
   
	for(int i=0;i<columns.Count;i++){
		CheckIsNullOrEmptyParameters(columns[i],i+1==columns.Count,3);
	}
   
}
public void GenerateIndent(int indentLevel)
{
    for (int i = 0; i < indentLevel; i++)
	{
		Response.Write('\t');
	}
}
public void CheckIsNullOrEmptyParameters(ColumnSchema column,bool isLast,int indent){
    
    string csharpType=GetCSharpVariableType(column);
    if(column.Name.ToLower()=="id")
    return;
     bool flagNull=column.AllowDBNull;
     
        if(csharpType=="string"||csharpType=="String"){
        
                if(!flagNull)
                {
                    GenerateIndent(indent);
                    Response.Write("if (string.IsNullOrEmpty(result.Message) && string.IsNullOrWhiteSpace(model.{0}))",column.Name);
                    Response.WriteLine("{");
                    GenerateIndent(indent+1);
                    Response.WriteLine("result.SetCode(TipMessage.{0}Empty);",column.Name);    
                    GenerateIndent(indent);
                    Response.WriteLine("}");
                }
                GenerateIndent(indent);
                Response.Write("if (string.IsNullOrEmpty(result.Message) &&!string.IsNullOrWhiteSpace(model.{0})&& model.{0}.Length > {1})",column.Name,column.Size);
                Response.WriteLine("{");
                GenerateIndent(indent+1);
                Response.WriteLine("result.SetCode(TipMessage.{0}Length);",column.Name);    
                GenerateIndent(indent);
                Response.WriteLine("}");
        }
        else if(!flagNull)
        {
            if(csharpType=="DateTime")
            {
            
                    GenerateIndent(indent);
                    Response.Write("if (string.IsNullOrEmpty(result.Message) && (model.{0}==null||model.{0}==DateTime.MinValue))",column.Name);
                    Response.WriteLine("{");
                    GenerateIndent(indent+1);
                    Response.WriteLine("result.SetCode(TipMessage.{0}Empty);",column.Name);    
                    GenerateIndent(indent);
                    Response.WriteLine("}"); 
                
            }
            else if(csharpType!="bool")
            {
                GenerateIndent(indent);
                Response.Write("if (string.IsNullOrEmpty(result.Message) && model.{0}< 0)",column.Name);
                Response.WriteLine("{");
                GenerateIndent(indent+1);
                Response.WriteLine("result.SetCode(TipMessage.{0}Empty);",column.Name);    
                GenerateIndent(indent);
                Response.WriteLine("}");  
            }
     }
    
}



public string GetClassName(TableSchema table)
{
    string tableName=table.Name;
    if(tableName.Length>0 && tableName.StartsWith(TablePrefix)){
        return tableName.Remove(0,TablePrefix.Length);    
    }
    else
	{
		return tableName;
	}
}

public string GetSqlDbType(ColumnSchema column)
{
	switch (column.NativeType)
	{
		case "bigint": return "BigInt";
		case "binary": return "Binary";
		case "bit": return "Bit";
		case "char": return "Char";
		case "datetime": return "DateTime";
		case "decimal": return "Decimal";
		case "float": return "Float";
		case "image": return "Image";
		case "int": return "Int";
		case "money": return "Money";
		case "nchar": return "NChar";
		case "ntext": return "NText";
		case "numeric": return "Decimal";
		case "nvarchar": return "NVarChar";
		case "real": return "Real";
		case "smalldatetime": return "SmallDateTime";
		case "smallint": return "SmallInt";
		case "smallmoney": return "SmallMoney";
		case "sql_variant": return "Variant";
		case "sysname": return "NChar";
		case "text": return "Text";
		case "timestamp": return "Timestamp";
		case "tinyint": return "TinyInt";
		case "uniqueidentifier": return "UniqueIdentifier";
		case "varbinary": return "VarBinary";
		case "varchar": return "VarChar";
		default: return "__UNKNOWN__" + column.NativeType;
	}
}

public string GetPrimaryKeyType(TableSchema table)
{
	if (table.PrimaryKey != null)
	{
		if (table.PrimaryKey.MemberColumns.Count == 1)
		{
			return GetCSharpVariableType(table.PrimaryKey.MemberColumns[0]);
		}
		else
		{
			throw new ApplicationException("This template will not work on primary keys with more than one member column.");
		}
	}
	else
	{
		throw new ApplicationException("This template will only work on tables with a primary key.");
	}
}

public string GetWheres(TableSchema table)
{
    System.Text.StringBuilder result=new System.Text.StringBuilder();
    foreach(ColumnSchema key in  this.SourceTable.Columns)
    {
        string csharpType=GetCSharpVariableType(key);
        switch(csharpType)
        {
            case "string":
            case "String":
                result.AppendFormat(@"
            if (!string.IsNullOrWhiteSpace(criterion.{0}))
            {{
                list = list.Where(o => o.{0}.Contains(criterion.{0}));
            }}
",key.Name);
                break;
            case "DateTime":
            case "DateTime?":
                 result.AppendFormat(@"
            if (criterion.{0}Begin.HasValue && criterion.{0}Begin != DateTime.MinValue)
            {{
                list = list.Where(o => o.{0} >= criterion.{0}Begin);
            }}
            if (criterion.{0}End.HasValue && criterion.{0}End != DateTime.MinValue)
            {{
                list = list.Where(o => o.{0} <= criterion.{0}End);
            }}
",key.Name);
                break;
            default:
                result.AppendFormat(@"
            if (criterion.{0}.HasValue)
            {{
                list = list.Where(o => o.{0} == criterion.{0});
            }}
            ",key.Name);
                break;
        }
        
    }
    return result.ToString().Trim(',');
}


public override string GetFileName()
{
	return this.GetClassName(this.SourceTable) + "Criterion.cs";
}
public string GetTableTitle()
{
  return  this.SourceTable.ExtendedProperties["Title"].Value.ToString();
}
public string GetTableIndex()
{
  return  this.SourceTable.ExtendedProperties["Index"].Value.ToString();
}
</script>

关键点讲解:
(1)、<%=namespaceName%>:在生成的时候,在生成的总文件中所定义的命名空间,会替代所有有该名称的文件数据
(2)、GetTableTitle:获取数据库表定义的标题
(3)、GetClassName:获取表名,并去掉前缀(这里是在项目开发中约定俗成的,可以根据自己项目的实际情况进行相应的更改)
(4)、CreateCriterionByColumn:根据数据库表字段的数据类型组装查询条件,以便适应业务逻辑的复杂查询条件

3、Services.cst文件:业务服务层模板

<%@ CodeTemplate Language="C#" TargetLanguage="C#" Description="Generates a very simple business object." %>
<%@ Property Name="SourceTable" Type="SchemaExplorer.TableSchema" Category="Context" Description="Table that the object is based on." %>
<%@ Property Name="TablePrefix" Type="System.String" Default="User_" Category="2. Options"
	Description="If this prefix is found at the start of a table name, it will be stripped off." %>
    <%@ Property Name="namespaceName" Type="System.String" Default="YSS.Users" Category="2. Options"
	Description="If this prefix is found at the start of a table name, it will be stripped off." %>
<%@ Assembly Name="SchemaExplorer" %>
<%@ Assembly Name="System.Data" %>
<%@ Import Namespace="SchemaExplorer" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Collections.Generic" %>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Common.Model;
using Common.Utils;
using <%=namespaceName%>.Services.IServices;
using <%=namespaceName%>.Services.Criterion;
using <%=namespaceName%>.Switch;
using <%=namespaceName%>.DTO;

namespace <%=namespaceName%>.Services.Services
{
    /// <summary>
    /// <%=GetTableTitle() %>
    /// </summary>
    public class <%=GetClassName(SourceTable) %>Service : Common.Utils.Disposable.DisposableBase, IServices.I<%=GetClassName(SourceTable) %>Service
    {
         #region IDisposable Support
        protected override void DisposeOther()
        {
            this.IBLL<%=GetClassName(SourceTable) %>.Dispose();
        }
        #endregion
        
        private BLL.IBLL.IBLL<%=GetClassName(SourceTable) %> IBLL<%=GetClassName(SourceTable) %> = BLL.BLLFactory.BLLCreater.Instance().IBLL<%=GetClassName(SourceTable) %>;
        public Result<DTO.<%=GetClassName(SourceTable) %>Info> Add(<%=namespaceName%>.DTO.<%=GetClassName(SourceTable) %>Info model)
        {
            Data.Model.<%=GetClassName(SourceTable) %> obj = Switch.<%=GetClassName(SourceTable) %>DtoSwitch.Switch(model);
            var resultModel = IBLL<%=GetClassName(SourceTable) %>.Add(obj);
            Result<DTO.<%=GetClassName(SourceTable) %>Info> result = new Result<DTO.<%=GetClassName(SourceTable) %>Info>(resultModel.IsSuccess, resultModel.StatusID, resultModel.Message);
            if (result.StatusID > 0)
            {
                result.Data = <%=namespaceName%>.Switch.<%=GetClassName(SourceTable) %>DtoSwitch.Switch(resultModel.Data);
            }
            return result;
        }
        public Result<DTO.<%=GetClassName(SourceTable) %>Info> Update(<%=namespaceName%>.DTO.<%=GetClassName(SourceTable) %>Info model)
        {
            Data.Model.<%=GetClassName(SourceTable) %> obj = Switch.<%=GetClassName(SourceTable) %>DtoSwitch.Switch(model);
            var resultModel = IBLL<%=GetClassName(SourceTable) %>.Update(obj);
            Result<DTO.<%=GetClassName(SourceTable) %>Info> result = new Result<DTO.<%=GetClassName(SourceTable) %>Info>(resultModel.IsSuccess, resultModel.StatusID, resultModel.Message);
            if (result.StatusID > 0)
            {
                result.Data = <%=namespaceName%>.Switch.<%=GetClassName(SourceTable) %>DtoSwitch.Switch(resultModel.Data);
            }
            return result;
        }
        /// <summary>
        /// 删除
        /// </summary>
        <%=GetPrimaryKeysTitle(SourceTable) %>
        /// <returns></returns>
        public Result Delete(<%=GetPrimaryKeys(SourceTable) %>)
        {
            return IBLL<%=GetClassName(SourceTable) %>.Delete(<%=GetPrimaryKeysWhere(SourceTable) %>);
        }
        /// <summary>
        /// 删除
        /// </summary>
        <%=GetPrimaryKeysTitleByMore(SourceTable) %>
        /// <returns></returns>
        public Result Deletes(<%=GetPrimaryKeysByMore(SourceTable) %>)
        {
            return IBLL<%=GetClassName(SourceTable) %>.Deletes(<%=GetPrimaryKeysWhereByMore(SourceTable) %>);
        }
        /// <summary>
        /// 跟据主键获取<%=GetTableTitle() %>
        /// </summary>
        <%=GetPrimaryKeysTitle(SourceTable) %>
        /// <returns></returns>
        public Result<DTO.<%=GetClassName(SourceTable) %>Info> GetModel(<%=GetPrimaryKeys(SourceTable) %>)
        {
            var resultModel = IBLL<%=GetClassName(SourceTable) %>.GetModel(<%=GetPrimaryKeysWhere(SourceTable) %>);
            Result<DTO.<%=GetClassName(SourceTable) %>Info> result = new Result<DTO.<%=GetClassName(SourceTable) %>Info>(resultModel.IsSuccess, resultModel.StatusID, resultModel.Message);
            if (result.StatusID > 0)
            {
                result.Data = <%=namespaceName%>.Switch.<%=GetClassName(SourceTable) %>DtoSwitch.Switch(resultModel.Data);
            }
            return result;
        }
        /// <summary>
        /// 获取<%=GetTableTitle() %>列表
        /// </summary>
        /// <param name="criterion">条件</param>
        /// <returns></returns>
        public Result<PagingDto<DTO.<%=GetClassName(SourceTable) %>Info>> GetList(Criterion.<%=GetClassName(SourceTable) %>Criterion criterion)
        {
            BLL.Criterion.<%=GetClassName(SourceTable) %>Criterion where = new BLL.Criterion.<%=GetClassName(SourceTable) %>Criterion()
            {
                IsPaging = criterion.IsPaging,
                PageNo = criterion.PageNo,
                PageSize = criterion.PageSize,
<%=GetCriterion(SourceTable) %>
            };
            if (criterion.SortingCriteria == null || criterion.SortingCriteria.Count == 0)
            {
<%=GetDefaultSortingCriteria(SourceTable) %>
            }

            foreach (var order in criterion.SortingCriteria)
            {
                where.AddSortingCriteria(order.PropertyName, order.Descending);
            }

            var resultModel = IBLL<%=GetClassName(SourceTable) %>.GetList(where);
            Result<PagingDto<DTO.<%=GetClassName(SourceTable) %>Info>> result = new Result<PagingDto<DTO.<%=GetClassName(SourceTable) %>Info>>(resultModel.IsSuccess, resultModel.StatusID, resultModel.Message);
            
            result.Data = new PagingDto<DTO.<%=GetClassName(SourceTable) %>Info>();
            result.Data.Data = <%=namespaceName%>.Switch.<%=GetClassName(SourceTable) %>DtoSwitch.SwitchForList(resultModel.Data.Data);

            result.Data.IsPaging = resultModel.Data.IsPaging;
            result.Data.TotalRecordCount = resultModel.Data.TotalRecordCount;
            result.Data.PageNo = resultModel.Data.PageNo;
            result.Data.PageSize = resultModel.Data.PageSize;
            
            return result;
        }
       
    }
}
<script runat="template">
public int Index=0;
public void AddIndex(){
    Index=Index+1;
}

public string GetPrimaryKeys(TableSchema table)
{
    System.Text.StringBuilder result=new System.Text.StringBuilder();
    foreach(ColumnSchema key in  this.SourceTable.PrimaryKey.MemberColumns)
    {
        result.AppendFormat("{0} {1},",GetCSharpVariableType(key),key.Name);
    }
    return result.ToString().Trim(',');
}
public string GetPrimaryKeysTitle(TableSchema table)
{
    System.Text.StringBuilder result=new System.Text.StringBuilder();
    foreach(ColumnSchema key in  this.SourceTable.PrimaryKey.MemberColumns)
    {
        result.AppendFormat("/// <param name=\"{0}\">{1}</param>\n",key.Name,key.Description.Replace("\r\n",""));
    }
    return result.ToString().Trim("\n".ToCharArray());
}

public string GetPrimaryKeysWhere(TableSchema table)
{
    System.Text.StringBuilder result=new System.Text.StringBuilder();
    foreach(ColumnSchema key in  this.SourceTable.PrimaryKey.MemberColumns)
    {
        result.AppendFormat("{0},",key.Name);
    }
    return result.ToString().Trim(",".ToCharArray());
}
public string GetPrimaryKeysByMore(TableSchema table)
{
    System.Text.StringBuilder result=new System.Text.StringBuilder();
    foreach(ColumnSchema key in  this.SourceTable.PrimaryKey.MemberColumns)
    {
        result.AppendFormat("{0}[] {1}s,",GetCSharpVariableType(key),key.Name);
    }
    return result.ToString().Trim(',');
}
public string GetPrimaryKeysTitleByMore(TableSchema table)
{
    System.Text.StringBuilder result=new System.Text.StringBuilder();
    foreach(ColumnSchema key in  this.SourceTable.PrimaryKey.MemberColumns)
    {
        result.AppendFormat("/// <param name=\"{0}s\">{1}集</param>\n",key.Name,key.Description.Replace("\r\n",""));
    }
    return result.ToString().Trim("\n".ToCharArray());
}
public string GetPrimaryKeysWhereByMore(TableSchema table)
{
    System.Text.StringBuilder result=new System.Text.StringBuilder();
    foreach(ColumnSchema key in  this.SourceTable.PrimaryKey.MemberColumns)
    {
        result.AppendFormat("{0}s,",key.Name);
    }
    return result.ToString().Trim(",".ToCharArray());
}
public string GetCriterion(TableSchema table)
{
     System.Text.StringBuilder result=new System.Text.StringBuilder();
    foreach(ColumnSchema key in  table.Columns)
    {
        string csharpType=GetCSharpVariableType(key);
        switch(csharpType)
        {
            case "DateTime":
            case "DateTime?":
                result.AppendFormat("                {0}Begin = criterion.{0}Begin,",key.Name);
                result.AppendLine();
                result.AppendFormat("                {0}End = criterion.{0}End,",key.Name);
            break;
            default:
                result.AppendFormat("                {0} = criterion.{0},",key.Name);
                break;
        }
        result.AppendLine();
    }
    return result.ToString().Trim(",".ToCharArray()).Trim("\n\r".ToCharArray());
}
public string GetDefaultSortingCriteria(TableSchema table)
{
    System.Text.StringBuilder result=new System.Text.StringBuilder();
    foreach(ColumnSchema key in  this.SourceTable.PrimaryKey.MemberColumns)
    {
        result.AppendFormat("                criterion.AddSortingCriteria(\"{0}\", true);",key.Name);
        result.AppendLine();
    }
    return result.ToString().Trim("\n\r".ToCharArray());
}

public string GetCamelCaseName(string value)
{
	//return value.Substring(0, 1).ToLower() + value.Substring(1);
	return value;
}

public string GetMemberVariableName(ColumnSchema column)
{
	string propertyName = GetPropertyName(column);
	//string memberVariableName = "_" + GetCamelCaseName(propertyName);
	string memberVariableName = GetCamelCaseName(propertyName);
	return memberVariableName;
}

public string GetPropertyName(ColumnSchema column)
{
	string propertyName = column.Name;
	
	if (propertyName == column.Table.Name + "Name") return "Name";
	if (propertyName == column.Table.Name + "Description") return "Description";
	
	if (propertyName.EndsWith("TypeCode")) propertyName = propertyName.Substring(0, propertyName.Length - 4);
	
	return propertyName;
}
		
public string GetMemberVariableDefaultValue(ColumnSchema column)
{
	switch (column.DataType)
	{
		case DbType.Guid:
		{
			return "Guid.Empty";
		}
		case DbType.AnsiString:
		case DbType.AnsiStringFixedLength:
		case DbType.String:
		case DbType.StringFixedLength:
		{
			return "String.Empty";
		}
		default:
		{
			return "";
		}
	}
}

public string GetCSharpVariableType(ColumnSchema column)
{
	if (column.Name.EndsWith("TypeCode")) return column.Name;
	string typeName="object";
	switch (column.DataType)
	{
		case DbType.AnsiString: typeName= "string";break;
		case DbType.AnsiStringFixedLength: typeName= "string";break;
		case DbType.Binary: typeName= "byte[]";break;
		case DbType.Boolean: typeName= "bool";break;
		case DbType.Byte: typeName= "byte";break;
		case DbType.Currency: typeName= "decimal";break;
		case DbType.Date: typeName= "DateTime";break;
		case DbType.DateTime: typeName= "DateTime";break;
		case DbType.Decimal: typeName= "decimal";break;
		case DbType.Double: typeName= "double";break;
		case DbType.Guid: typeName= "Guid";break;
		case DbType.Int16: typeName= "short";break;
		case DbType.Int32: typeName= "int";break;
		case DbType.Int64: typeName= "long";break;
		case DbType.Object: typeName= "object";break;
		case DbType.SByte: typeName= "sbyte";break;
		case DbType.Single: typeName= "float";break;
		case DbType.String: typeName= "string";break;
		case DbType.StringFixedLength: typeName= "string";break;
		case DbType.Time: typeName= "TimeSpan";break;
		case DbType.UInt16: typeName= "ushort";break;
		case DbType.UInt32: typeName= "uint";break;
		case DbType.UInt64: typeName= "ulong";break;
		case DbType.VarNumeric: typeName= "decimal";break;
		default:
		{
			typeName= "__UNKNOWN__" + column.NativeType;break;
		}
	}
    if(column.AllowDBNull && !"string,object".Contains(typeName)){
        typeName+="?";
    }
    return typeName;
}

public void CheckParameters(IList<ColumnSchema> columns){
  
   
	for(int i=0;i<columns.Count;i++){
		CheckIsNullOrEmptyParameters(columns[i],i+1==columns.Count,3);
	}
   
}
public void GenerateIndent(int indentLevel)
{
    for (int i = 0; i < indentLevel; i++)
	{
		Response.Write('\t');
	}
}
public void CheckIsNullOrEmptyParameters(ColumnSchema column,bool isLast,int indent){
    
    string csharpType=GetCSharpVariableType(column);
    if(column.Name.ToLower()=="id")
    return;
     bool flagNull=column.AllowDBNull;
     
        if(csharpType=="string"||csharpType=="String"){
        
            if(!flagNull)
            {
                //GenerateIndent(indent);
                Response.WriteLine("            if (string.IsNullOrEmpty(result.Message) && string.IsNullOrWhiteSpace(model.{0}))",column.Name);
                Response.WriteLine("            {");
                //GenerateIndent(indent+1);
                Response.WriteLine("                result.SetCode(TipMessage.{0}Empty);",column.Name);    
                //GenerateIndent(indent);
                Response.WriteLine("            }");
            }
            //GenerateIndent(indent);
            Response.WriteLine("            if (string.IsNullOrEmpty(result.Message) && !string.IsNullOrWhiteSpace(model.{0}) && model.{0}.Length > {1})",column.Name,column.Size);
            Response.WriteLine("            {");
            //GenerateIndent(indent+1);
            Response.WriteLine("                result.SetCode(TipMessage.{0}Length);",column.Name);    
            //GenerateIndent(indent);
            Response.WriteLine("            }");
        }
        else if(!flagNull)
        {
            if(csharpType=="DateTime")
            {
                //GenerateIndent(indent);
                Response.WriteLine("            if (string.IsNullOrEmpty(result.Message) && (model.{0} == null || model.{0} == DateTime.MinValue))",column.Name);
                Response.WriteLine("            {");
                //GenerateIndent(indent+1);
                Response.WriteLine("                result.SetCode(TipMessage.{0}Empty);",column.Name);    
                //GenerateIndent(indent);
                Response.WriteLine("            }"); 
                
            }
            else if(csharpType!="bool")
            {
                //GenerateIndent(indent);
                Response.WriteLine("            if (string.IsNullOrEmpty(result.Message) && model.{0} < 0)",column.Name);
                Response.WriteLine("            {");
                //GenerateIndent(indent+1);
                Response.WriteLine("                result.SetCode(TipMessage.{0}Empty);",column.Name);    
                //GenerateIndent(indent);
                Response.WriteLine("            }"); 
            }
     }
    
}



public string GetClassName(TableSchema table)
{
    string tableName=table.Name;
    if(tableName.Length>0 && tableName.StartsWith(TablePrefix)){
        return tableName.Remove(0,TablePrefix.Length);    
    }
    else
	{
		return tableName;
	}
}

public string GetSqlDbType(ColumnSchema column)
{
	switch (column.NativeType)
	{
		case "bigint": return "BigInt";
		case "binary": return "Binary";
		case "bit": return "Bit";
		case "char": return "Char";
		case "datetime": return "DateTime";
		case "decimal": return "Decimal";
		case "float": return "Float";
		case "image": return "Image";
		case "int": return "Int";
		case "money": return "Money";
		case "nchar": return "NChar";
		case "ntext": return "NText";
		case "numeric": return "Decimal";
		case "nvarchar": return "NVarChar";
		case "real": return "Real";
		case "smalldatetime": return "SmallDateTime";
		case "smallint": return "SmallInt";
		case "smallmoney": return "SmallMoney";
		case "sql_variant": return "Variant";
		case "sysname": return "NChar";
		case "text": return "Text";
		case "timestamp": return "Timestamp";
		case "tinyint": return "TinyInt";
		case "uniqueidentifier": return "UniqueIdentifier";
		case "varbinary": return "VarBinary";
		case "varchar": return "VarChar";
		default: return "__UNKNOWN__" + column.NativeType;
	}
}

public string GetPrimaryKeyType(TableSchema table)
{
	if (table.PrimaryKey != null)
	{
		if (table.PrimaryKey.MemberColumns.Count == 1)
		{
			return GetCSharpVariableType(table.PrimaryKey.MemberColumns[0]);
		}
		else
		{
			throw new ApplicationException("This template will not work on primary keys with more than one member column.");
		}
	}
	else
	{
		throw new ApplicationException("This template will only work on tables with a primary key.");
	}
}

public string GetWheres(TableSchema table)
{
    System.Text.StringBuilder result=new System.Text.StringBuilder();
    foreach(ColumnSchema key in  this.SourceTable.Columns)
    {
        string csharpType=GetCSharpVariableType(key);
        switch(csharpType)
        {
            case "string":
            case "String":
                result.AppendFormat(@"
            if (!string.IsNullOrWhiteSpace(criterion.{0}))
            {{
                list = list.Where(o => o.{0}.Contains(criterion.{0}));
            }}
",key.Name);
                break;
            case "DateTime":
            case "DateTime?":
                 result.AppendFormat(@"
            if (criterion.{0}Begin.HasValue && criterion.{0}Begin != DateTime.MinValue)
            {{
                list = list.Where(o => o.{0} >= criterion.{0}Begin);
            }}
            if (criterion.{0}End.HasValue && criterion.{0}End != DateTime.MinValue)
            {{
                list = list.Where(o => o.{0} <= criterion.{0}End);
            }}
",key.Name);
                break;
            default:
                result.AppendFormat(@"
            if (criterion.{0}.HasValue)
            {{
                list = list.Where(o => o.{0} == criterion.{0});
            }}
",key.Name);
                break;
        }
        
    }
    return result.ToString().Trim(',');
}


public override string GetFileName()
{
	return this.GetClassName(this.SourceTable) + "Service.cs";
}
public string GetTableTitle()
{
  return  this.SourceTable.ExtendedProperties["Title"].Value.ToString();
}
public string GetTableIndex()
{
  return  this.SourceTable.ExtendedProperties["Index"].Value.ToString();
}
</script>

关键点讲解:
(1)、<%=namespaceName%>:在生成的时候,在生成的总文件中所定义的命名空间,会替代所有有该名称的文件数据
(2)、GetTableTitle:获取数据库表定义的标题
(3)、GetClassName:获取表名,并去掉前缀(这里是在项目开发中约定俗成的,可以根据自己项目的实际情况进行相应的更改)
(4)、GetPrimaryKeys,GetPrimaryKeysTitle,GetPrimaryKeysByMore,GetPrimaryKeysTitleByMore:获取表主键的相关信息,可以针对唯一记录做操作
(5)、GetCSharpVariableType:将数据库字段的数据类型转化为c#语法的数据类型

ServicesClientProxy

1、ServicesClientProxy.cst文件:主要是生成与应用层的交互类

<%@ CodeTemplate Language="C#" TargetLanguage="C#" Description="Generates a very simple business object." %>
<%@ Property Name="SourceTable" Type="SchemaExplorer.TableSchema" Category="Context" Description="Table that the object is based on." %>
<%@ Property Name="TablePrefix" Type="System.String" Default="User_" Category="2. Options"
	Description="If this prefix is found at the start of a table name, it will be stripped off." %>
    <%@ Property Name="namespaceName" Type="System.String" Default="YSS.Users" Category="2. Options"
	Description="If this prefix is found at the start of a table name, it will be stripped off." %>
<%@ Assembly Name="SchemaExplorer" %>
<%@ Assembly Name="System.Data" %>
<%@ Import Namespace="SchemaExplorer" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Collections.Generic" %>
using Common.Model;
using Common.Utils;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using <%=namespaceName%>.Services.IServices;

namespace <%=namespaceName%>.ServicesClientProxy
{
    /// <summary>
    /// <%=GetTableTitle() %>
    /// </summary>
    public class <%=GetClassName(SourceTable) %>Service : Common.Utils.Disposable.DisposableBase
    {
    
        #region IDisposable Support
        protected override void DisposeOther()
        {
            this.I<%=GetClassName(SourceTable) %>Service.Dispose();
        }
        #endregion
        
        private I<%=GetClassName(SourceTable) %>Service I<%=GetClassName(SourceTable) %>Service;
        public <%=GetClassName(SourceTable) %>Service()
        {
            I<%=GetClassName(SourceTable) %>Service = ServicesFactory.Instance().I<%=GetClassName(SourceTable) %>Service;
        }
        private static object _lockInstance = new object();
        /// <summary>
        /// <%=GetTableTitle() %>服务
        /// </summary>
        /// <returns></returns>
        public static <%=GetClassName(SourceTable) %>Service Instance()
        {
            return Common.Utils.Disposable.ObjectInstance.GetCurrentObject<WeiXinUserService>();
            <%--return  new <%=GetClassName(SourceTable) %>Service();
            if (_instance == null)
            {
                lock (_lockInstance)
                {
                    if (_instance == null)
                    {
                        _instance = new <%=GetClassName(SourceTable) %>Service();
                    }
                }
            }
            return _instance;--%>
        }
        /// <summary>
        /// 新增
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public Result<DTO.<%=GetClassName(SourceTable) %>Info> Add(DTO.<%=GetClassName(SourceTable) %>Info model)
        {
            return I<%=GetClassName(SourceTable) %>Service.Add(model);
        }
        /// <summary>
        /// 修改
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public Result<DTO.<%=GetClassName(SourceTable) %>Info> Update(DTO.<%=GetClassName(SourceTable) %>Info model)
        {
            return I<%=GetClassName(SourceTable) %>Service.Update(model);
        }
        /// <summary>
        /// 删除
        /// </summary>
        <%=GetPrimaryKeysTitle(SourceTable) %>
        /// <returns></returns>
        public Result Delete(<%=GetPrimaryKeys(SourceTable) %>)
        {
            return I<%=GetClassName(SourceTable) %>Service.Delete(<%=GetPrimaryKeysWhere(SourceTable) %>);
        }
        /// <summary>
        /// 删除
        /// </summary>
        <%=GetPrimaryKeysTitleByMore(SourceTable) %>
        /// <returns></returns>
        public Result Deletes(<%=GetPrimaryKeysByMore(SourceTable) %>)
        {
            return I<%=GetClassName(SourceTable) %>Service.Deletes(<%=GetPrimaryKeysWhereByMore(SourceTable) %>);
        }
        /// <summary>
        /// 跟据主键获取<%=GetTableTitle() %>
        /// </summary>
        <%=GetPrimaryKeysTitle(SourceTable) %>
        /// <returns></returns>
        public Result<DTO.<%=GetClassName(SourceTable) %>Info> GetModel(<%=GetPrimaryKeys(SourceTable) %>)
        {
            return I<%=GetClassName(SourceTable) %>Service.GetModel(<%=GetPrimaryKeysWhere(SourceTable) %>);
        }
        /// <summary>
        /// 获取<%=GetTableTitle() %>列表
        /// </summary>
        /// <param name="criterion">条件</param>
        /// <returns></returns>
        public Result<PagingDto<DTO.<%=GetClassName(SourceTable) %>Info>> GetList(Services.Criterion.<%=GetClassName(SourceTable) %>Criterion criterion)
        {
            return I<%=GetClassName(SourceTable) %>Service.GetList(criterion);
        }
       
    }
}
<script runat="template">
public int Index=0;
public void AddIndex(){
    Index=Index+1;
}

public string GetPrimaryKeys(TableSchema table)
{
    System.Text.StringBuilder result=new System.Text.StringBuilder();
    foreach(ColumnSchema key in  this.SourceTable.PrimaryKey.MemberColumns)
    {
        result.AppendFormat("{0} {1},",GetCSharpVariableType(key),key.Name);
    }
    return result.ToString().Trim(',');
}
public string GetPrimaryKeysTitle(TableSchema table)
{
    System.Text.StringBuilder result=new System.Text.StringBuilder();
    foreach(ColumnSchema key in  this.SourceTable.PrimaryKey.MemberColumns)
    {
        result.AppendFormat("/// <param name=\"{0}\">{1}</param>\n",key.Name,key.Description.Replace("\r\n",""));
    }
    return result.ToString().Trim("\n".ToCharArray());
}

public string GetPrimaryKeysWhere(TableSchema table)
{
    System.Text.StringBuilder result=new System.Text.StringBuilder();
    foreach(ColumnSchema key in  this.SourceTable.PrimaryKey.MemberColumns)
    {
        result.AppendFormat("{0},",key.Name);
    }
    return result.ToString().Trim(",".ToCharArray());
}
public string GetPrimaryKeysByMore(TableSchema table)
{
    System.Text.StringBuilder result=new System.Text.StringBuilder();
    foreach(ColumnSchema key in  this.SourceTable.PrimaryKey.MemberColumns)
    {
        result.AppendFormat("{0}[] {1}s,",GetCSharpVariableType(key),key.Name);
    }
    return result.ToString().Trim(',');
}
public string GetPrimaryKeysTitleByMore(TableSchema table)
{
    System.Text.StringBuilder result=new System.Text.StringBuilder();
    foreach(ColumnSchema key in  this.SourceTable.PrimaryKey.MemberColumns)
    {
        result.AppendFormat("/// <param name=\"{0}s\">{1}集</param>\n",key.Name,key.Description.Replace("\r\n",""));
    }
    return result.ToString().Trim("\n".ToCharArray());
}
public string GetPrimaryKeysWhereByMore(TableSchema table)
{
    System.Text.StringBuilder result=new System.Text.StringBuilder();
    foreach(ColumnSchema key in  this.SourceTable.PrimaryKey.MemberColumns)
    {
        result.AppendFormat("{0}s,",key.Name);
    }
    return result.ToString().Trim(",".ToCharArray());
}
public string GetCriterion(TableSchema table)
{
     System.Text.StringBuilder result=new System.Text.StringBuilder();
    foreach(ColumnSchema key in  table.Columns)
    {
        string csharpType=GetCSharpVariableType(key);
        switch(csharpType)
        {
            case "DateTime":
            case "DateTime?":
                result.AppendFormat("                {0}Begin = criterion.{0}Begin,",key.Name);
                result.AppendLine();
                result.AppendFormat("                {0}End = criterion.{0}End,",key.Name);
            break;
            default:
                result.AppendFormat("                {0} = criterion.{0},",key.Name);
                break;
        }
        result.AppendLine();
    }
    return result.ToString().Trim(",".ToCharArray()).Trim("\n\r".ToCharArray());
}
public string GetDefaultSortingCriteria(TableSchema table)
{
    System.Text.StringBuilder result=new System.Text.StringBuilder();
    foreach(ColumnSchema key in  this.SourceTable.PrimaryKey.MemberColumns)
    {
        result.AppendFormat("                criterion.AddSortingCriteria(\"{0}\", true);",key.Name);
        result.AppendLine();
    }
    return result.ToString().Trim("\n\r".ToCharArray());
}

public string GetCamelCaseName(string value)
{
	//return value.Substring(0, 1).ToLower() + value.Substring(1);
	return value;
}

public string GetMemberVariableName(ColumnSchema column)
{
	string propertyName = GetPropertyName(column);
	//string memberVariableName = "_" + GetCamelCaseName(propertyName);
	string memberVariableName = GetCamelCaseName(propertyName);
	return memberVariableName;
}

public string GetPropertyName(ColumnSchema column)
{
	string propertyName = column.Name;
	
	if (propertyName == column.Table.Name + "Name") return "Name";
	if (propertyName == column.Table.Name + "Description") return "Description";
	
	if (propertyName.EndsWith("TypeCode")) propertyName = propertyName.Substring(0, propertyName.Length - 4);
	
	return propertyName;
}
		
public string GetMemberVariableDefaultValue(ColumnSchema column)
{
	switch (column.DataType)
	{
		case DbType.Guid:
		{
			return "Guid.Empty";
		}
		case DbType.AnsiString:
		case DbType.AnsiStringFixedLength:
		case DbType.String:
		case DbType.StringFixedLength:
		{
			return "String.Empty";
		}
		default:
		{
			return "";
		}
	}
}

public string GetCSharpVariableType(ColumnSchema column)
{
	if (column.Name.EndsWith("TypeCode")) return column.Name;
	string typeName="object";
	switch (column.DataType)
	{
		case DbType.AnsiString: typeName= "string";break;
		case DbType.AnsiStringFixedLength: typeName= "string";break;
		case DbType.Binary: typeName= "byte[]";break;
		case DbType.Boolean: typeName= "bool";break;
		case DbType.Byte: typeName= "byte";break;
		case DbType.Currency: typeName= "decimal";break;
		case DbType.Date: typeName= "DateTime";break;
		case DbType.DateTime: typeName= "DateTime";break;
		case DbType.Decimal: typeName= "decimal";break;
		case DbType.Double: typeName= "double";break;
		case DbType.Guid: typeName= "Guid";break;
		case DbType.Int16: typeName= "short";break;
		case DbType.Int32: typeName= "int";break;
		case DbType.Int64: typeName= "long";break;
		case DbType.Object: typeName= "object";break;
		case DbType.SByte: typeName= "sbyte";break;
		case DbType.Single: typeName= "float";break;
		case DbType.String: typeName= "string";break;
		case DbType.StringFixedLength: typeName= "string";break;
		case DbType.Time: typeName= "TimeSpan";break;
		case DbType.UInt16: typeName= "ushort";break;
		case DbType.UInt32: typeName= "uint";break;
		case DbType.UInt64: typeName= "ulong";break;
		case DbType.VarNumeric: typeName= "decimal";break;
		default:
		{
			typeName= "__UNKNOWN__" + column.NativeType;break;
		}
	}
    if(column.AllowDBNull && !"string,object".Contains(typeName)){
        typeName+="?";
    }
    return typeName;
}

public void CheckParameters(IList<ColumnSchema> columns){
  
   
	for(int i=0;i<columns.Count;i++){
		CheckIsNullOrEmptyParameters(columns[i],i+1==columns.Count,3);
	}
   
}
public void GenerateIndent(int indentLevel)
{
    for (int i = 0; i < indentLevel; i++)
	{
		Response.Write('\t');
	}
}
public void CheckIsNullOrEmptyParameters(ColumnSchema column,bool isLast,int indent){
    
    string csharpType=GetCSharpVariableType(column);
    if(column.Name.ToLower()=="id")
    return;
     bool flagNull=column.AllowDBNull;
     
        if(csharpType=="string"||csharpType=="String"){
        
            if(!flagNull)
            {
                //GenerateIndent(indent);
                Response.WriteLine("            if (string.IsNullOrEmpty(result.Message) && string.IsNullOrWhiteSpace(model.{0}))",column.Name);
                Response.WriteLine("            {");
                //GenerateIndent(indent+1);
                Response.WriteLine("                result.SetCode(TipMessage.{0}Empty);",column.Name);    
                //GenerateIndent(indent);
                Response.WriteLine("            }");
            }
            //GenerateIndent(indent);
            Response.WriteLine("            if (string.IsNullOrEmpty(result.Message) && !string.IsNullOrWhiteSpace(model.{0}) && model.{0}.Length > {1})",column.Name,column.Size);
            Response.WriteLine("            {");
            //GenerateIndent(indent+1);
            Response.WriteLine("                result.SetCode(TipMessage.{0}Length);",column.Name);    
            //GenerateIndent(indent);
            Response.WriteLine("            }");
        }
        else if(!flagNull)
        {
            if(csharpType=="DateTime")
            {
                //GenerateIndent(indent);
                Response.WriteLine("            if (string.IsNullOrEmpty(result.Message) && (model.{0} == null || model.{0} == DateTime.MinValue))",column.Name);
                Response.WriteLine("            {");
                //GenerateIndent(indent+1);
                Response.WriteLine("                result.SetCode(TipMessage.{0}Empty);",column.Name);    
                //GenerateIndent(indent);
                Response.WriteLine("            }"); 
                
            }
            else if(csharpType!="bool")
            {
                //GenerateIndent(indent);
                Response.WriteLine("            if (string.IsNullOrEmpty(result.Message) && model.{0} < 0)",column.Name);
                Response.WriteLine("            {");
                //GenerateIndent(indent+1);
                Response.WriteLine("                result.SetCode(TipMessage.{0}Empty);",column.Name);    
                //GenerateIndent(indent);
                Response.WriteLine("            }"); 
            }
     }
    
}



public string GetClassName(TableSchema table)
{
    string tableName=table.Name;
    if(tableName.Length>0 && tableName.StartsWith(TablePrefix)){
        return tableName.Remove(0,TablePrefix.Length);    
    }
    else
	{
		return tableName;
	}
}

public string GetSqlDbType(ColumnSchema column)
{
	switch (column.NativeType)
	{
		case "bigint": return "BigInt";
		case "binary": return "Binary";
		case "bit": return "Bit";
		case "char": return "Char";
		case "datetime": return "DateTime";
		case "decimal": return "Decimal";
		case "float": return "Float";
		case "image": return "Image";
		case "int": return "Int";
		case "money": return "Money";
		case "nchar": return "NChar";
		case "ntext": return "NText";
		case "numeric": return "Decimal";
		case "nvarchar": return "NVarChar";
		case "real": return "Real";
		case "smalldatetime": return "SmallDateTime";
		case "smallint": return "SmallInt";
		case "smallmoney": return "SmallMoney";
		case "sql_variant": return "Variant";
		case "sysname": return "NChar";
		case "text": return "Text";
		case "timestamp": return "Timestamp";
		case "tinyint": return "TinyInt";
		case "uniqueidentifier": return "UniqueIdentifier";
		case "varbinary": return "VarBinary";
		case "varchar": return "VarChar";
		default: return "__UNKNOWN__" + column.NativeType;
	}
}

public string GetPrimaryKeyType(TableSchema table)
{
	if (table.PrimaryKey != null)
	{
		if (table.PrimaryKey.MemberColumns.Count == 1)
		{
			return GetCSharpVariableType(table.PrimaryKey.MemberColumns[0]);
		}
		else
		{
			throw new ApplicationException("This template will not work on primary keys with more than one member column.");
		}
	}
	else
	{
		throw new ApplicationException("This template will only work on tables with a primary key.");
	}
}

public string GetWheres(TableSchema table)
{
    System.Text.StringBuilder result=new System.Text.StringBuilder();
    foreach(ColumnSchema key in  this.SourceTable.Columns)
    {
        string csharpType=GetCSharpVariableType(key);
        switch(csharpType)
        {
            case "string":
            case "String":
                result.AppendFormat(@"
            if (!string.IsNullOrWhiteSpace(criterion.{0}))
            {{
                list = list.Where(o => o.{0}.Contains(criterion.{0}));
            }}
",key.Name);
                break;
            case "DateTime":
            case "DateTime?":
                 result.AppendFormat(@"
            if (criterion.{0}Begin.HasValue && criterion.{0}Begin != DateTime.MinValue)
            {{
                list = list.Where(o => o.{0} >= criterion.{0}Begin);
            }}
            if (criterion.{0}End.HasValue && criterion.{0}End != DateTime.MinValue)
            {{
                list = list.Where(o => o.{0} <= criterion.{0}End);
            }}
",key.Name);
                break;
            default:
                result.AppendFormat(@"
            if (criterion.{0}.HasValue)
            {{
                list = list.Where(o => o.{0} == criterion.{0});
            }}
",key.Name);
                break;
        }
        
    }
    return result.ToString().Trim(',');
}


public override string GetFileName()
{
	return this.GetClassName(this.SourceTable) + "Service.cs";
}
public string GetTableTitle()
{
  return  this.SourceTable.ExtendedProperties["Title"].Value.ToString();
}
public string GetTableIndex()
{
  return  this.SourceTable.ExtendedProperties["Index"].Value.ToString();
}
</script>

关键点讲解:
(1)、主要是起到应用层与业务逻辑层之间的桥梁作用

结语

以上为业务服务层,业务服务代理层的生成模板,关键点就是获取数据库相关表,之后根据相关的名称,数据类型转化为标准的c#语法,达到一次编写,无数输出的效果,任何数据库,数据库表均可以通过此模板进行生成,遵守约定的规则即可,

本章是模板生成章节的最后一章,后面的章节我会就实际项目的开发,结合开发知识的讲解,贯穿整个项目,让我们拭目以待,一起学习下去。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

本心win

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值