前言
前面一章已经讲解了TipMessage.cst、Switch.cst文件、DTO.cst文件里面的内容,本章会继续讲后面的目录内容,让我们继续看下去吧
讲解
接下来会继续讲解业务服务代理层,业务服务层,业务逻辑层的生成模板。
因为之前都是贴出一部分代码,然后再附上资源,供朋友们自行查看,但后面想了想还是不能这么做,
因为这样做可能代码有了,但是不理解,也是没有办法做的,就算做了可能也是错漏百出。
所以接下来的内容会分多章详细的讲,同时也还是会附上资源的。
BLL
1、IBLL.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.Text;
using System.Threading.Tasks;
using <%=namespaceName%>.BLL.Criterion;
namespace <%=namespaceName%>.BLL.IBLL
{
/// <summary>
/// <%=GetTableTitle() %>
/// </summary>
public interface IBLL<%=GetClassName(SourceTable) %> : IDisposable
{
/// <summary>
/// 新增
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
Result<Data.Model.<%=GetClassName(SourceTable) %>> Add(Data.Model.<%=GetClassName(SourceTable) %> model);
/// <summary>
/// 修改
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
Result<Data.Model.<%=GetClassName(SourceTable) %>> Update(Data.Model.<%=GetClassName(SourceTable) %> model);
<%if(SourceTable.HasPrimaryKey) {%>
/// <summary>
/// 删除
/// </summary>
<%=GetPrimaryKeysTitle(SourceTable) %>
/// <returns></returns>
Result Delete(<%=GetPrimaryKeys(SourceTable) %>);
/// <summary>
/// 删除多个
/// </summary>
<%=GetPrimaryKeysTitleByMore(SourceTable) %>
/// <returns></returns>
Result Deletes(<%=GetPrimaryKeysByMore(SourceTable) %>);
/// <summary>
/// 跟据主键获取<%=GetTableTitle() %>
/// </summary>
<%=GetPrimaryKeysTitle(SourceTable) %>
/// <returns></returns>
Result<Data.Model.<%=GetClassName(SourceTable) %>> GetModel(<%=GetPrimaryKeys(SourceTable) %>);
/// <summary>
/// 跟据主键集获取<%=GetTableTitle() %>
/// </summary>
<%=GetPrimaryKeysTitleByMore(SourceTable) %>
/// <returns></returns>
Result<IQueryable<Data.Model.<%=GetClassName(SourceTable) %>>> GetModel(<%=GetPrimaryKeysByMore(SourceTable) %>);
<%}%>
/// <summary>
/// 获取<%=GetTableTitle() %>列表
/// </summary>
/// <param name="criterion">条件</param>
/// <returns></returns>
Result<PagingModel<Data.Model.<%=GetClassName(SourceTable) %>>> GetList(<%=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 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 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 override string GetFileName()
{
return "IBLL"+this.GetClassName(this.SourceTable) + ".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、BLLCriterion.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%>.BLL.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、BLL.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.Interfaces;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Common.Model;
using <%=namespaceName%>.TipMessage;
using Common.Utils;
using System.Linq.Expressions;
using <%=namespaceName%>.BLL.Criterion;
using System.Data.Entity;
namespace <%=namespaceName%>.BLL.BLL
{
/// <summary>
/// <%=GetTableTitle() %>
/// </summary>
public class BLL<%=GetClassName(SourceTable) %> : Common.Utils.Disposable.DisposableBase, IBLL.IBLL<%=GetClassName(SourceTable) %>
{
#region IDisposable Support
protected override void DisposeOther()
{
this.UnitOfWork.Dispose();
}
#endregion
protected class TipMessage : <%=GetClassName(SourceTable) %>Tip
{ }
protected IUnitOfWork UnitOfWork { get; private set; }
public Data.DAL.IDAL.IDAL<%=GetClassName(SourceTable) %> dal { get; set; }
public BLL<%=GetClassName(SourceTable) %>()
{
var factory = Data.DAL.DALFactory.DALCreater.Instance().IdalFactory;
var unitOfWorkFactory = factory.CreateOfWorkFactory();
this.UnitOfWork = unitOfWorkFactory.Create();
this.dal = factory.CreateDal<%=GetClassName(SourceTable) %>(this.UnitOfWork);
}
/// <summary>
/// 新增<%=GetTableTitle()%>
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public Result<Data.Model.<%=GetClassName(SourceTable) %>> Add(Data.Model.<%=GetClassName(SourceTable) %> model)
{
Result<Data.Model.<%=GetClassName(SourceTable) %>> result = CheckModel(model);
if (!result.IsSuccess)
{
return result;
}
dal.Add(model, true);
result.Data = model;
result.IsSuccess = true;
result.SetCode(TipMessage.AddSuccess);
return result;
}
/// <summary>
/// 修改<%=GetTableTitle()%>
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public Result<Data.Model.<%=GetClassName(SourceTable) %>> Update(Data.Model.<%=GetClassName(SourceTable) %> model)
{
Result<Data.Model.<%=GetClassName(SourceTable) %>> result = CheckModel(model);
if (!result.IsSuccess)
{
return result;
}
dal.Update(model, true);
result.Data = model;
result.IsSuccess = true;
result.SetCode(TipMessage.UpdateSuccess);
return result;
}
<%if(SourceTable.HasPrimaryKey) {%>
/// <summary>
/// 删除<%=GetTableTitle()%>
/// </summary>
<%=GetPrimaryKeysTitle(SourceTable) %>
/// <returns></returns>
public Result Delete(<%=GetPrimaryKeys(SourceTable) %>)
{
var result = new Result();
result.SetCode(TipMessage.DeleteFailure);
var data = dal.GetAll().AsQueryable();
data = data.Where(o => <%=GetPrimaryKeysWhere(SourceTable) %>);
if (data.Count() == 0)
{
result.SetCode(TipMessage.IDUnExists);
result.IsSuccess = false;
return result;
}
<%if(CheckColumn(SourceTable,"IsAvailable")){%>
data.ToList().ForEach(o => { o.IsAvailable = false; this.dal.Update(o, new string[] { "IsAvailable" }); });
<%}else{ %>
this.dal.Delete(data);
<%}%>
this.UnitOfWork.Save();
result.IsSuccess = true;
result.SetCode(TipMessage.DeleteSuccess);
return result;
}
/// <summary>
/// 删除多个<%=GetTableTitle()%>
/// </summary>
<%=GetPrimaryKeysTitleByMore(SourceTable) %>
/// <returns></returns>
public Result Deletes(<%=GetPrimaryKeysByMore(SourceTable) %>)
{
var result = new Result();
result.SetCode(TipMessage.DeleteFailure);
var data = dal.GetAll().AsQueryable();
data = data.Where(o => <%=GetPrimaryKeysWhereByMore(SourceTable) %>);
if (data.Count() == 0)
{
result.SetCode(TipMessage.IDUnExists);
result.IsSuccess = false;
return result;
}
<%if(CheckColumn(SourceTable,"IsAvailable")){%>
data.ToList().ForEach(o => { o.IsAvailable = false; this.dal.Update(o, new string[] { "IsAvailable" }); });
<%}else{ %>
this.dal.Delete(data);
<%}%>
this.UnitOfWork.Save();
result.IsSuccess = true;
result.SetCode(TipMessage.DeleteSuccess);
return result;
}
/// <summary>
/// 跟据主键获取<%=GetTableTitle()%>
/// </summary>
<%=GetPrimaryKeysTitle(SourceTable) %>
/// <returns></returns>
public Result<Data.Model.<%=GetClassName(SourceTable) %>> GetModel(<%=GetPrimaryKeys(SourceTable) %>)
{
Result<Data.Model.<%=GetClassName(SourceTable) %>> result = new Result<Data.Model.<%=GetClassName(SourceTable) %>>();
result.Data = dal.GetAll().AsQueryable().AsNoTracking().Where(o => <%=GetPrimaryKeysWhere(SourceTable) %>).FirstOrDefault();
result.IsSuccess = result.Data != null;
var tip = result.IsSuccess ? TipMessage.Success : TipMessage.SelectNull;
result.SetCode(tip);
return result;
}
/// <summary>
/// 跟据主键获取<%=GetTableTitle()%>集
/// </summary>
<%=GetPrimaryKeysTitleByMore(SourceTable) %>
/// <returns></returns>
public Result<IQueryable<Data.Model.<%=GetClassName(SourceTable) %>>> GetModel(<%=GetPrimaryKeysByMore(SourceTable) %>)
{
Result<IQueryable<Data.Model.<%=GetClassName(SourceTable) %>>> result = new Result<IQueryable<Data.Model.<%=GetClassName(SourceTable) %>>>();
result.Data = dal.GetAll().AsQueryable().AsNoTracking().Where(o => <%=GetPrimaryKeysWhereByMore(SourceTable) %>);
result.IsSuccess = result.Data != null;
var tip = result.IsSuccess ? TipMessage.Success : TipMessage.SelectNull;
result.SetCode(tip);
return result;
}
<%}%>
/// <summary>
/// 获取<%=GetTableTitle()%>列表
/// </summary>
/// <param name="criterion">条件</param>
/// <returns></returns>
public Result<PagingModel<Data.Model.<%=GetClassName(SourceTable) %>>> GetList(<%=GetClassName(SourceTable) %>Criterion criterion)
{
var result = new Result<PagingModel<Data.Model.<%=GetClassName(SourceTable) %>>>();
var data = dal.GetAll();
data = data.AsNoTracking();
data = this.Where(data.AsQueryable(), criterion);
data = SortingService.Sort(data, criterion.SortingCriteria);
if (criterion.IsPaging)
{
result.Data = data.Page(criterion.PageNo.Value, criterion.PageSize.Value);
}
else
{
result.Data = data.Page(1, Int32.MaxValue);
}
result.Data.IsPaging = criterion.IsPaging;
result.IsSuccess = (result.Data != null && result.Data.PageNo <= result.Data.PageCount);
var tip = result.IsSuccess ? TipMessage.Success : TipMessage.SelectNull;
result.SetCode(tip);
if (!result.IsSuccess && result.Data.TotalRecordCount > 0)
{
result.SetCode(TipMessage.PageIndexThanMaxPageCount);
}
return result;
}
#region // 辅助
/// <summary>
/// 检查内容
/// </summary>
/// <returns></returns>
public static Result<Data.Model.<%=GetClassName(SourceTable) %>> CheckModel(Data.Model.<%=GetClassName(SourceTable) %> model)
{
Result<Data.Model.<%=GetClassName(SourceTable) %>> result = Result<Data.Model.<%=GetClassName(SourceTable) %>>.Success();
#region // 检查内容
<% CheckParameters(SourceTable.Columns); %>
#endregion // 检查内容
result.IsSuccess = string.IsNullOrEmpty(result.Message);
return result;
}
/// <summary>
/// 条件生成
/// </summary>
/// <returns></returns>
private IQueryable<Data.Model.<%=GetClassName(SourceTable) %>> Where(IQueryable<Data.Model.<%=GetClassName(SourceTable) %>> list, Criterion.<%=GetClassName(SourceTable) %>Criterion criterion)
{
<%=GetWheres(SourceTable) %>
return list;
}
#endregion // 辅助
}
}
<script runat="template">
public int Index=0;
public void AddIndex(){
Index=Index+1;
}
public bool CheckColumn(TableSchema table,string name)
{
return table.Columns.FindIndex(o=>o.Name==name)!=-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("o.{0} == {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.Contains(o.{0})&&",key.Name);
}
return result.ToString().Trim("&&".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=="Guid")
{
//GenerateIndent(indent);
Response.WriteLine(" if (string.IsNullOrEmpty(result.Message) && model.{0} == Guid.Empty)",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)
{
if(key.Name=="IsAvailable")
{
result.AppendFormat(@"
if (criterion.IsAvailable.HasValue)
{{
list = list.Where(o => o.IsAvailable == criterion.IsAvailable);
}}
else
{{
list = list.Where(o => o.IsAvailable);
}}
");
}else
{
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 "BLL"+this.GetClassName(this.SourceTable) + ".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#语法的数据类型
4、BLLCreater.cst文件:创建实体类
<%@ CodeTemplate Language="C#" TargetLanguage="C#" Description="Generates a very simple business object." %>
<%@ Property Name="SourceDatabaseTables" Type="SchemaExplorer.TableSchemaCollection" Default="" Optional="False" DeepLoad="True" Category="01. GettingStarted - Required"%>
<%@ 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 System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace <%=namespaceName%>.BLL.BLLFactory
{
public class BLLCreater
{
/*private const string _configPath = "/Config/BLLPlugInConfig.xml";
private const string _iDalAssembly = "<%=namespaceName%>.BLL.IBLL";
private const string _defaultDalAssembly = "<%=namespaceName%>.BLL.BLL";
private Common.Utils.Plug.PlugInHelper _plugInHelper;*/
private static BLLCreater _instance = null;
private static string lockInstance = "";
public static BLLCreater Instance()
{
if (_instance == null)
{
lock (lockInstance)
{
if (_instance == null)
{
_instance = new BLLCreater();
}
}
}
return _instance;
}
private BLLCreater()
{
//_plugInHelper = new Common.Utils.Plug.PlugInHelper(AppDomain.CurrentDomain.BaseDirectory + _configPath, _iDalAssembly, _defaultDalAssembly);
}
<% foreach(TableSchema table in this.SourceDatabaseTables) { %>
<% string className=GetClassName(table); %>
private static string _lockIBLL<%=className%> = "";
private IBLL.IBLL<%=className%> _IBLL<%=className%>;
/// <summary>
/// <%=GetClassNametTableTitle(table) %>
/// </summary>
public IBLL.IBLL<%=className%> IBLL<%=className%>
{
get
{
return new BLL.BLL<%=className%>();
if (_IBLL<%=className%> == null)
{
lock (_lockIBLL<%=className%>)
{
if (_IBLL<%=className%> == null)
{
_IBLL<%=className%> = new BLL.BLL<%=className%>(); //_plugInHelper.GetPlugInClass<IBLL.IBLL<%=className%>>("IBLL<%=className%>", "BLL<%=className%>");
}
}
}
return _IBLL<%=className%>;
}
}
<%}%>
}
}
<script runat="template">
public string GetClassNametTableTitle(TableSchema table)
{
return table.ExtendedProperties["Title"].Value.ToString();
}
public override string GetFileName()
{
return "BLLCreater.cs";
}
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;
}
}
</script>
关键点讲解:
(1)、<%=namespaceName%>:在生成的时候,在生成的总文件中所定义的命名空间,会替代所有有该名称的文件数据
(2)、GetTableTitle:获取数据库表定义的标题
(3)、GetClassName:获取表名,并去掉前缀(这里是在项目开发中约定俗成的,可以根据自己项目的实际情况进行相应的更改)
(4)、GetClassNametTableTitle:获取数据库表名
结语
以上为业务逻辑层的生成模板,关键点就是获取数据库相关表,之后根据相关的名称,数据类型转化为标准的c#语法,达到一次编写,无数输出的效果,任何数据库,数据库表均可以通过此模板进行生成,遵守约定的规则即可
未完待续,请接着看下一篇…