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

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

前言

前面一章已经讲解了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#语法,达到一次编写,无数输出的效果,任何数据库,数据库表均可以通过此模板进行生成,遵守约定的规则即可

未完待续,请接着看下一篇…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

本心win

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

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

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

打赏作者

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

抵扣说明:

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

余额充值