.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#语法,达到一次编写,无数输出的效果,任何数据库,数据库表均可以通过此模板进行生成,遵守约定的规则即可,
本章是模板生成章节的最后一章,后面的章节我会就实际项目的开发,结合开发知识的讲解,贯穿整个项目,让我们拭目以待,一起学习下去。