运用CodeSmith Studio实现C#项目构架

前言:运用CodeSmith Studio可以非常方便的针对具体的数据库生成C#项目的构架。本文将简要介绍操作流程。

准备工作:安装好CodeSmith Studio(网上一搜,到处都有下载)、Visual Studio、Mssql Server。

  1. 建立好数据库。假如数据库名叫SkillExchange。
  2. 启动CodeSmith,连接数据库。在Schema Explorer(如果主界面没有显示,在菜单View中将其打开)中点击“+”图标,在弹出的【Data Source Manager】中选择【Add】。在弹出【Data Source】对话框中,自己给该数据源取一个名称,【Provider Type】选择【SqlSchemaProvider】,点击【Connection String】右侧的按钮,可以帮助生成连接字符串。之后点几个OK,一个Close,数据库连接就大功告成了。
  3. 使用模版生成3层代码。在模板管理器【Template Explorer】中选择模版,双击打开。这里要用到的项目构架代码可能找不到,我在这里提供。该模板来源于网络,也还有可以改进的地方。

  Model.cst(用于生成数据库表中字段的封装类,每个表生成一个类) 

MODEL

<%@ CodeTemplate Language="C#" TargetLanguage="C#" Description="Template description here." %>
<%@ Assembly Name="SchemaExplorer" %>
<%@ Import Namespace="SchemaExplorer" %>
<%@ Property Name="SourceTable" Type="SchemaExplorer.TableSchema" Category="Context" %>
<%@ Import Namespace="System.Text.RegularExpressions" %>
using System;
using System.Collections.Generic;
using System.Text;

namespace MODEL
{
    [Serializable]
    public class <%=GetClassName(SourceTable)%>
    {
        <% foreach (ColumnSchema column in SourceTable.Columns) {%>
        <% if (column.IsForeignKeyMember) {%>
        private <%=GetPascalName(GetForeignKeyColumnType(column))%> <%=GetCamelName(GetForeignKeyColumnName(column))%> = new <%=GetPascalName(GetForeignKeyColumnType(column))%>();
        <% }else{%>
        private <%=GetCSharpVariableType(column)%> <%=GetCamelName(column)%>;
        <% }%>
        <% }%>    

        <% foreach (ColumnSchema column in SourceTable.Columns) {%>
        <% if (column.IsForeignKeyMember) {%>
        public <%=GetPascalName(GetForeignKeyColumnType(column)) %> <%=GetPascalName(GetForeignKeyColumnName(column))%>
        {
            get { return <%=GetCamelName(GetForeignKeyColumnName(column)) %>; }
            set { <%=GetCamelName(GetForeignKeyColumnName(column)) %> = value; }
        }
        <% } else {%>
        public <%=GetCSharpVariableType(column) %> <%=GetPascalName(column) %>
        {
            get { return <%= GetCamelName(column) %>; }
            set { <%= GetCamelName(column) %> = value; }
        }
        <% }%>
        <% }%>
    }
}
<script runat="template">

public string MakeSingle(string name)
{
    return name;
}
public string GetCamelName(ColumnSchema column)
{
    return column.Name.Substring(0, 1).ToLower() + column.Name.Substring(1);
}
public string GetCamelName(string value)
{
    return value.Substring(0, 1).ToLower() + value.Substring(1);
}
public string GetPascalName(ColumnSchema column)
{
    return column.Name.Substring(0, 1).ToUpper() + column.Name.Substring(1);
}
public string GetPascalName(string value)
{
    return value.Substring(0, 1).ToUpper() + value.Substring(1);
}
public string GetClassName(TableSchema table)
{
    return GetPascalName(MakeSingle(table.Name));
}
public string GetForeignKeyColumnType(ColumnSchema column)
{
    return column.Table.ForeignKeys[0].PrimaryKeyTable.Name;
}
public string GetForeignKeyColumnName(ColumnSchema column)
{
    if(column.Name.Substring(column.Name.Length-2).ToLower() == "id")
    {
        return column.Name.Substring(0,column.Name.Length-2);
    }
    else
    {
        return column.Name;
    }
}

public string GetStructureParameter()
{//int id,string name
        string temp = "";
        foreach(ColumnSchema column in SourceTable.NonPrimaryKeyColumns)
        {
                if(column.IsForeignKeyMember)
                {
                    temp += GetPascalName(GetForeignKeyColumnType(column)) + " " +GetCamelName(GetForeignKeyColumnName(column)) + ",";
                }
                else
                {
                    temp += GetCSharpVariableType(column) + " " + GetCamelName(column) + ",";
                }
        }
        return temp.Substring(0,temp.Length-1);
}
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 GetCSharpVariableType(ColumnSchema column)
{
    if (column.Name.EndsWith("TypeCode")) return column.Name;

    switch (column.DataType)
    {
        case DbType.AnsiString: return "string";
        case DbType.AnsiStringFixedLength: return "string";
        case DbType.Binary: return "byte[]";
        case DbType.Boolean: return "bool";
        case DbType.Byte: return "byte";
        case DbType.Currency: return "decimal";
        case DbType.Date: return "DateTime";
        case DbType.DateTime: return "DateTime";
        case DbType.Decimal: return "decimal";
        case DbType.Double: return "double";
        case DbType.Guid: return "Guid";
        case DbType.Int16: return "short";
        case DbType.Int32: return "int";
        case DbType.Int64: return "long";
        case DbType.Object: return "object";
        case DbType.SByte: return "sbyte";
        case DbType.Single: return "float";
        case DbType.String: return "string";
        case DbType.StringFixedLength: return "string";
        case DbType.Time: return "TimeSpan";
        case DbType.UInt16: return "ushort";
        case DbType.UInt32: return "uint";
        case DbType.UInt64: return "ulong";
        case DbType.VarNumeric: return "decimal";
        default:
        {
            return "__UNKNOWN__" + column.NativeType;
        }
    }
}
public override string GetFileName()
{
    return     GetClassName(SourceTable) + ".cs";
}
</script>

  DAL.cst(Data Access Layer,用于生成数据库的增删改查类)

DAL

<%@ CodeTemplate Language="C#" TargetLanguage="C#" Description="Create:Teacher Pan"%>
<%@ Assembly Name="SchemaExplorer" %>
<%@ Import Namespace="SchemaExplorer" %>
<%@ Property Name="SourceTable" Type="SchemaExplorer.TableSchema" Category="Context" %>
<%@ Import Namespace="System.Text.RegularExpressions" %>
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using MODEL;

namespace DAL
{
    public class <%=GetClassName(SourceTable)%>Service
    {
        private const string SQL_INSERT_<%=SourceTable.Name.ToUpper()%> = "<%=GetAddConstString(SourceTable)%>";
        private const string SQL_UPDATE_<%=SourceTable.Name.ToUpper()%> = "<%=GetUpdateConstString(SourceTable)%>";
        private const string SQL_DELETE_<%=SourceTable.Name.ToUpper()%>_BY_ID = "<%=GetDeleteConstString(SourceTable)%>";
        private const string SQL_SELECT_<%=SourceTable.Name.ToUpper()%>_ALL = "SELECT * FROM <%=SourceTable.Name%>";
        private const string SQL_SELECT_ONE_<%=SourceTable.Name.ToUpper()%>_BY_ID = "SELECT * FROM <%=SourceTable.Name%> WHERE <%=GetPascalName(SourceTable.PrimaryKey.MemberColumns[0].Name)%>[email protected]<%=GetPascalName(SourceTable.PrimaryKey.MemberColumns[0].Name)%>";

        public static int Add<%=GetClassName(SourceTable)%>(<%=GetClassName(SourceTable)%> <%=GetCamelName(GetClassName(SourceTable))%>)
        {
            <%=GetAddMothodText(SourceTable)%>
        }

        public static int Update<%=GetClassName(SourceTable)%>(<%=GetClassName(SourceTable)%> <%=GetCamelName(GetClassName(SourceTable))%>)
        {
            <%=GetUpdateMothodText(SourceTable)%>
        }

        public static int Delete<%=GetClassName(SourceTable)%>ById(<%=GetCSharpVariableType(SourceTable.PrimaryKey.MemberColumns[0].Column)%> id)
        {
            <%=GetDeleteMothodText(SourceTable)%>
        }

        public static List<<%=GetClassName(SourceTable)%>> GetAll<%=SourceTable.Name%>()
        {
            return Get<%=SourceTable.Name%>BySql(CommandType.Text, SQL_SELECT_<%=SourceTable.Name.ToUpper()%>_ALL, null);
        }

        public static <%=GetClassName(SourceTable)%> Get<%=GetClassName(SourceTable)%>ById(<%=GetCSharpVariableType(SourceTable.PrimaryKey.MemberColumns[0].Column)%> id)
        {
            SqlParameter commandParameters = new SqlParameter("@<%=GetPascalName(SourceTable.PrimaryKey.MemberColumns[0].Name)%>",id);
            List<<%=GetClassName(SourceTable)%>> list = Get<%=SourceTable.Name%>BySql(CommandType.Text ,SQL_SELECT_ONE_<%= SourceTable.Name.ToUpper() %>_BY_ID, commandParameters);
            if (list.Count > 0)
            {
                return list[0];
            }
            return null;
        }

        private static List<<%=GetClassName(SourceTable)%>> Get<%=SourceTable.Name%>BySql(CommandType commandType, string commandText, params SqlParameter[] commandParameters)
        {
            List<<%=GetClassName(SourceTable)%>> list = new List<<%=GetClassName(SourceTable)%>>();
            using(SqlDataReader reader = DBHelper.ExecuteGetReader(commandType,commandText,commandParameters))
            {
                List<string> columnNames = new List<string>();
                for (int i = 0; i < reader.FieldCount; i++)
                {
                    columnNames.Add(reader.GetName(i));
                }
                while (reader.Read())
                {
                    <%=GetClassName(SourceTable)%> <%=GetCamelName(GetClassName(SourceTable))%> = new <%=GetClassName(SourceTable)%>();

                    //NonForeignKey
                    <%=GetNonForeignKeyColumnsText(SourceTable)%>
                    <%if(SourceTable.ForeignKeys.Count > 0){%>
                    //ForeignKey
                    <%for(int i=0;i<SourceTable.ForeignKeys.Count;i++){%>
                    <%=GetForeignKeyTableNewObjectText(SourceTable.ForeignKeys[i].PrimaryKeyTable,SourceTable.ForeignKeys[i].ForeignKeyMemberColumns[0])%>
                    <%=GetForeignKeyColumnsText(SourceTable.ForeignKeys[i].PrimaryKeyTable,SourceTable.ForeignKeys[i].ForeignKeyMemberColumns[0])%>
                    <%=AddForeignKeyObjectInPrimaryObject(SourceTable.ForeignKeys[i].PrimaryKeyTable,SourceTable.ForeignKeys[i].ForeignKeyMemberColumns[0])%>
                    <%}%>
                    <%}%>
                    list.Add(<%=GetCamelName(GetClassName(SourceTable))%>);
                }
            }
            return list;
        }
      }
}

<script runat="template">
public string GetCSharpVariableType(ColumnSchema column)
{
    switch (column.DataType)
    {
        case DbType.AnsiString: return "string";
        case DbType.AnsiStringFixedLength: return "string";
        case DbType.Binary: return "byte[]";
        case DbType.Boolean: return "bool";
        case DbType.Byte: return "byte";
        case DbType.Currency: return "decimal";
        case DbType.Date: return "DateTime";
        case DbType.DateTime: return "DateTime";
        case DbType.Decimal: return "decimal";
        case DbType.Double: return "double";
        case DbType.Guid: return "Guid";
        case DbType.Int16: return "short";
        case DbType.Int32: return "int";
        case DbType.Int64: return "long";
        case DbType.Object: return "object";
        case DbType.SByte: return "sbyte";
        case DbType.Single: return "float";
        case DbType.String: return "string";
        case DbType.StringFixedLength: return "string";
        case DbType.Time: return "TimeSpan";
        case DbType.UInt16: return "ushort";
        case DbType.UInt32: return "uint";
        case DbType.UInt64: return "ulong";
        case DbType.VarNumeric: return "decimal";
        default:
        {
            return "__UNKNOWN__" + column.NativeType;
        }
    }
}
public string GetClassName(TableSchema table)
{    //need update ....
    return GetPascalName(MakeSingle(table.Name));  //ToPascalName
}
public string GetPascalName(string name)
{
    return name.Substring(0,1).ToUpper() + name.Substring(1);
}
public string GetCamelName(string name)
{
    return name.Substring(0,1).ToLower() + name.Substring(1);
}
public string GetPrimaryKeyName(TableSchema table)
{
    return SourceTable.PrimaryKey.MemberColumns[0].Name;
}
public string GetForeignKeyColumnType(ColumnSchema column)
{
    return column.Table.ForeignKeys[0].PrimaryKeyTable.Name;
}
public string GetForeignKeyColumnName(ColumnSchema column)
{
    if(column.Name.Substring(column.Name.Length-2).ToLower() == "id")
    {
        return column.Name.Substring(0,column.Name.Length-2);
    }
    else
    {
        return column.Name;
    }
}
public string GetForeignKeyTablePrimaryColumn(ColumnSchema column)
{
    return column.Table.ForeignKeys[0].PrimaryKeyTable.PrimaryKey.MemberColumns[0].Name;
}
/**/
public string MakeSingle(string name)
{
    return name;
}

public string GetAddConstString(TableSchema SourceTable)
{
    string temp = "INSERT INTO "+ SourceTable.Name +" VALUES (";
  foreach(ColumnSchema column in SourceTable.NonPrimaryKeyColumns)
    {
        temp += "@" + GetPascalName(column.Name) + ",";
    }
    return temp.Substring(0,temp.Length-1) + ");SELECT @@IDENTITY";
}
public string GetUpdateConstString(TableSchema SourceTable)
{
    //update x set [email protected],,,, where [email protected];
    string temp = "UPDATE " + SourceTable.Name +" SET ";
    foreach(ColumnSchema column in SourceTable.NonPrimaryKeyColumns)
    {
        temp += GetPascalName(column.Name) +"[email protected]" + GetPascalName(column.Name) + ",";
    }
    return temp.Substring(0,temp.Length-1) + " WHERE " + GetPascalName(SourceTable.PrimaryKey.MemberColumns[0].Name) + "[email protected]" + GetPascalName(SourceTable.PrimaryKey.MemberColumns[0].Name);
}
public string GetDeleteConstString(TableSchema SourceTable)
{
    //delete from table where [email protected];
    string temp = "DELETE FROM " + SourceTable.Name + " WHERE " + GetPascalName(SourceTable.PrimaryKey.MemberColumns[0].Name) + "[email protected]" + GetPascalName(SourceTable.PrimaryKey.MemberColumns[0].Name);
    return temp;
}
/*MothodText*/
public string GetAddMothodText(TableSchema SourceTable)
{
    string temp = "SqlParameter[] commandParameters = new SqlParameter[]" + "\r\n"
                + "\t\t\t"+ "{" +"\r\n";
    foreach(ColumnSchema column in SourceTable.NonPrimaryKeyColumns)
    {
            if(column.IsForeignKeyMember)
                temp += "\t\t\t\t"+"new SqlParameter(\"@" + GetPascalName(column.Name) + "\", " + GetCamelName(GetClassName(SourceTable)) + "." + GetPascalName(GetForeignKeyColumnName(column)) + "."+ GetForeignKeyTablePrimaryColumn(column) +"),\r\n";
            else
                temp += "\t\t\t\t"+"new SqlParameter(\"@" + GetPascalName(column.Name) + "\", " + GetCamelName(GetClassName(SourceTable)) + "." + GetPascalName(column.Name) + "),\r\n";
    }
    temp = temp.Substring(0,temp.Length-3) + "\r\n\t\t\t};";
    temp += "\r\n\t\t\t"+ "int id = Convert.ToInt32(DBHelper.ExecuteScalar(CommandType.Text, SQL_INSERT_" + SourceTable.Name.ToUpper() +", commandParameters));\r\n";
  temp += "\t\t\t"+"return id;";
  return temp;
}
public string GetUpdateMothodText(TableSchema SourceTable)
{
    string temp = "SqlParameter[] commandParameters = new SqlParameter[]" + "\r\n"
                + "\t\t\t"+ "{" +"\r\n";
      foreach(ColumnSchema column in SourceTable.Columns)
    {
            if(column.IsForeignKeyMember)
                temp += "\t\t\t\t"+"new SqlParameter(\"@" + GetPascalName(column.Name) + "\", " + GetCamelName(GetClassName(SourceTable)) + "." + GetPascalName(GetForeignKeyColumnName(column)) + "."+ GetForeignKeyTablePrimaryColumn(column) +"),\r\n";
            else
                temp += "\t\t\t\t"+"new SqlParameter(\"@" + GetPascalName(column.Name) + "\", " + GetCamelName(GetClassName(SourceTable)) + "." + GetPascalName(column.Name) + "),\r\n";
    }
    temp = temp.Substring(0,temp.Length-3) + "\r\n\t\t\t};";
    temp += "\r\n\t\t\t"+ "int rowCount = Convert.ToInt32(DBHelper.ExecuteNonQuery(CommandType.Text, SQL_UPDATE_"+ SourceTable.Name.ToUpper() +", commandParameters));\r\n";
  temp += "\t\t\t"+"return rowCount;";
  return temp;
}
public string GetDeleteMothodText(TableSchema SourceTable)
{
    string temp = "SqlParameter commandParameters = new SqlParameter(\"@" + GetPascalName(GetPrimaryKeyName(SourceTable)) +"\", id);";
    temp += "\r\n\t\t\t"+ "int rowCount = Convert.ToInt32(DBHelper.ExecuteNonQuery(CommandType.Text, SQL_DELETE_"+ SourceTable.Name.ToUpper() +"_BY_ID, commandParameters));\r\n";
  temp += "\t\t\t"+"return rowCount;";
  return temp;
}
public string GetNonForeignKeyColumnsText(TableSchema SourceTable)
{   //book.Id = (int)row["Id"];
    //book.Title = (string)row["Title"];
    string className = GetCamelName(GetClassName(SourceTable));
    string temp = "";
    foreach(ColumnSchema column in SourceTable.NonForeignKeyColumns)
    {
        temp += "if(columnNames.Contains(\""+ GetPascalName(column.Name) +"\"))"+"\r\n\t\t\t\t\t\t";
        if(GetCSharpVariableType(column) == "string")
        {
            temp += className + "." + GetPascalName(column.Name) + " = reader[\""+ GetPascalName(column.Name) +"\"].ToString();\r\n\t\t\t\t\t";
        }
        else
        {
            temp += className + "." + GetPascalName(column.Name) + " = ("+ GetCSharpVariableType(column) +")reader[\""+ GetPascalName(column.Name) +"\"];\r\n\t\t\t\t\t";
        }
    }
    return temp;
}
/*=============================*/
public string GetForeignKeyTableNewObjectText(TableSchema SourceTable,ColumnSchema columnName)
{
    string className = GetClassName(SourceTable);
    string temp = "";
    temp += className + " " + GetCamelName(className) + GetForeignKeyColumnName(columnName) + " = new " + className + "();";
    return temp;
}
public string GetForeignKeyColumnsText(TableSchema SourceTable,ColumnSchema columnName)//SourceTable=????????
{
    string className = GetClassName(SourceTable);
    string temp = "";
    int i=0;
    temp += ""+"if(columnNames.Contains(\""+ /*column*/columnName.Name +"\"))\r\n" + "\t\t\t\t\t{\r\n\t\t\t\t\t\t"
            + GetCamelName(className) + GetForeignKeyColumnName(columnName) + "." + SourceTable.Columns[0].Name + " = (" + GetCSharpVariableType(/*column*/columnName)
            + ")reader[\""+ /*column*/columnName.Name +"\"];" + "\r\n\t\t\t\t\t}\r\n\t\t\t\t\t";
    foreach(ColumnSchema column in SourceTable.Columns)
    {
        if(i!=0)
        {
        temp += ""+"if(columnNames.Contains(\""+ column.Name +"\"))\r\n" + "\t\t\t\t\t{\r\n\t\t\t\t\t\t"
            + GetCamelName(className) + GetForeignKeyColumnName(columnName) + "." + column.Name + " = (" + GetCSharpVariableType(column)
            + ")reader[\""+ column.Name +"\"];" + "\r\n\t\t\t\t\t}\r\n\t\t\t\t\t";
        }
        i++;
    }
    return temp;
}
public string AddForeignKeyObjectInPrimaryObject(TableSchema SourceTableForeign,ColumnSchema columnName)
{
    string className = GetClassName(SourceTableForeign);
    return GetCamelName(GetClassName(SourceTable)) + "." + GetPascalName(GetForeignKeyColumnName(columnName)) + " = " + GetCamelName(className) + GetForeignKeyColumnName(columnName) + ";\r\n";
}
public override string GetFileName()
{
    return this.GetClassName(this.SourceTable) + "Service.cs";
}
</script>

  BLL.cst(Business Logical Layer,对应于DAL层的每一个方法,起到调用DAL层的作用)

BLL

<%@ CodeTemplate Language="C#" TargetLanguage="C#" Description="Create:Teacher Pan"%>
<%@ Assembly Name="SchemaExplorer" %>
<%@ Import Namespace="SchemaExplorer" %>
<%@ Property Name="SourceTable" Type="SchemaExplorer.TableSchema" Category="Context" %>
<%@ Import Namespace="System.Text.RegularExpressions" %>
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using MODEL;
using DAL;

namespace BLL
{
    public class <%=MakeSingle(SourceTable.Name)%>Manager
    {
        public static int Add<%=MakeSingle(SourceTable.Name)%>(<%=MakeSingle(SourceTable.Name)%> <%=GetCamelName(MakeSingle(SourceTable.Name))%>)
        {
            return <%=MakeSingle(SourceTable.Name)%>Service.Add<%=MakeSingle(SourceTable.Name)%>(<%=GetCamelName(MakeSingle(SourceTable.Name))%>);
        }
        public static int Update<%=MakeSingle(SourceTable.Name)%>(<%=MakeSingle(SourceTable.Name)%> <%=GetCamelName(MakeSingle(SourceTable.Name))%>)
        {
            return <%=MakeSingle(SourceTable.Name)%>Service.Update<%=MakeSingle(SourceTable.Name)%>(<%=GetCamelName(MakeSingle(SourceTable.Name))%>);
        }
        public static int Delete<%=MakeSingle(SourceTable.Name)%>(<%=GetCSharpVariableType(SourceTable.PrimaryKey.MemberColumns[0].Column)%> id)
        {
            return <%=MakeSingle(SourceTable.Name)%>Service.Delete<%=MakeSingle(SourceTable.Name)%>ById(id);
        }
        public static List<<%=MakeSingle(SourceTable.Name)%>> GetAll<%=SourceTable.Name%>()
        {
            return <%=MakeSingle(SourceTable.Name)%>Service.GetAll<%=SourceTable.Name%>();
        }
        public static <%=MakeSingle(SourceTable.Name)%> Get<%=MakeSingle(SourceTable.Name)%>ById(<%=GetCSharpVariableType(SourceTable.PrimaryKey.MemberColumns[0].Column)%> id)
        {
            return <%=MakeSingle(SourceTable.Name)%>Service.Get<%=MakeSingle(SourceTable.Name)%>ById(id);
        }
    }
}
<script runat="template">
public string GetCSharpVariableType(ColumnSchema column)
{
    switch (column.DataType)
    {
        case DbType.AnsiString: return "string";
        case DbType.AnsiStringFixedLength: return "string";
        case DbType.Binary: return "byte[]";
        case DbType.Boolean: return "bool";
        case DbType.Byte: return "byte";
        case DbType.Currency: return "decimal";
        case DbType.Date: return "DateTime";
        case DbType.DateTime: return "DateTime";
        case DbType.Decimal: return "decimal";
        case DbType.Double: return "double";
        case DbType.Guid: return "Guid";
        case DbType.Int16: return "short";
        case DbType.Int32: return "int";
        case DbType.Int64: return "long";
        case DbType.Object: return "object";
        case DbType.SByte: return "sbyte";
        case DbType.Single: return "float";
        case DbType.String: return "string";
        case DbType.StringFixedLength: return "string";
        case DbType.Time: return "TimeSpan";
        case DbType.UInt16: return "ushort";
        case DbType.UInt32: return "uint";
        case DbType.UInt64: return "ulong";
        case DbType.VarNumeric: return "decimal";
        default:
        {
            return "__UNKNOWN__" + column.NativeType;
        }
    }
}
public string MakeSingle(string name)
{
    return name;
}
public string GetCamelName(string name)
{
    return name.Substring(0,1).ToLower() + name.Substring(1);
}
public override string GetFileName()
{
    return this.MakeSingle(this.SourceTable.Name) + "Manager.cs";
}
</script>

  

将上述三个源文件按对应文件名保存,然后用CodeSmith Studio打开即可使用。

打开一个源文件,如MODEL.cst,在属性窗口【Properties】中,我们会看到【SourceTable】,点击旁边的按钮,选择对应的表。然后按【F5】,或者菜单栏的【run】,即可生成我们需要的代码,每一个表对用生成MODEL、DAL、BLL三个代码,名字分别为 TableName.cs、TableNameServices.cs、TableNameManager.cs。生成第一个类之后马上执行下一步操作。

4.在Visual Studio中生成项目

新建项目,选择【其他项目类型】中的【Visual Studio解决方案】,假如解决方案取名为TestCS,路径为“D:\”。

在【解决方案管理器】中找到刚新建的解决方案,右键【添加】,【新建项目】,【类库】。创建名为MODEL、DAL、BLL的三个类库。将CodeSmith中生成的代码分别考到对应的项目文件夹中,在解决方案中添加好。

继续右键右键【添加】,【新建网站】。注意路径应浏览到刚新建项目的对应文件夹下 ,此例中为“D:\TestCS\WEB”,点击【确定】,如果提示目录不存在,需要创建,则创建。这样就可以保证三个类库和网站都在同一个目录下。

5.添加引用

右键【DAL】,【添加引用...】,在弹出的【添加引用】对话框中,切换到【项目】选项卡,选择MODEL,确定。接下来分别为【BLL】添加MODEL、DAL引用,为【WEB】添加MODEL、DAL、BLL引用。

6.启动项设置

右键【WEB】,【设为启动项目】。

至此,此项目的解决方案构架基本完成。

总结:这个构架总的来说还是,比较简单的项目,使用使用它还是比较方便的,需要添加方法也可以直接在对应的类中编写。如果编码过程中数据库表还有改动的话,这将是比较麻烦的事,因为MODEL、DAL两层的代码都要改变。另外,我还用过一种构架,动软代码生成器。它比较强大,甚至可以生成整个项目,可是我嫌它太过于庞大,比较适合大型项目。另一个原因就是第一次接触的就是CodeSmith,适合了它的模式,习惯啊习惯!

时间: 2024-08-07 08:20:58

运用CodeSmith Studio实现C#项目构架的相关文章

在Android Studio中创建项目和模拟器

北京电子科技学院 实      验      报      告 课程:移动平台应用开发实践  班级:201592  姓名:杨凤  学号:20159213 成绩:___________  指导老师:娄嘉鹏   实验日期 :2015.11.1 实验名称:           在Android Studio中创建项目和模拟器 实验内容:       1.在Android Studio中创建项目 2.创建并启动Android模拟器 一.实验简介 熟悉Android的开发环境.一些基本的操作技巧以及调试技

Android-Android studio 导入开源项目以及常见的错误

如何用 Android Studio 导入开源项目以及常见错误的解决办法 本篇以Github上最热门的MaterialDesign库,MaterialDesignLibrary来介绍怎样使用Android Sudio导入开源项目的,如果你和我一样刚刚从Eclipse转到AS,那本篇文章非常适合你. 如果不引入任何第三方库,不做自动化分渠道打包等操作,那可以在完全不了解Gradle的情况下进行Android项目的开发.但如果要想导入Github上的热门项目,必须首先熟悉Gradle. 1. Gra

导入开源库到基于Android Studio构建的项目中

前两天,谷歌发布了Android Studio 1.0的正式版,也有更多的人开始迁移到Android Studio进行开发.然而,网上很多的开源库,控件等还是以前的基于Eclipse进行开发,很多人不知道怎么导入到自己的基于Android Studio项目中来,微博上也有人私信我,让我来写写,正好今天回来的比较早,就写写吧.主要介绍一下常见的一些导包的场景. 前言 --project //项目目录 | build.gradle //项目的gradle配置文件 | settings.gradle

Android 升级到android studio 2.2项目死活run不起来

背景:升级到Android studio 2.2项目死活运行不起来 现象如下: run with --stacktrace --debug等等抛出的bug简直无法忍视 解决办法:把compileSdkVersion 改为23成功run起来了

Android studio多个项目之间怎么实现快速切换?

Android studio多个项目之间怎么实现快速切换?Android studio中打开的项目太多了,想切换到一个项目很麻烦,怎么才能快速切换到另一个项目中呢?请看下文详细介绍 在对Android studio中进行对项目中的开发Android上的代码,那么一个当中进行对项目上的开发,那么在就会打开多个项目对项目中进行对其的开发,当当对一个项目上的开发,根据自己的要求的话,那么切换到另一个项目的开发. 1.在当前的电脑的界面中,进行打开了两个的Android studio窗口. 2.在当前的

Android Studio导入Eclipse项目和一些常见的问题

Android Studio版本 Eclipse项目工程:一个主工程,一个Emojicon依赖库. 有两种方式导入Eclipse工程: 1.兼容Eclipse 2.全新的Android Gradle Project Google推荐用全新的方式,所以此处不介绍兼容模式导入. 请先关闭Android Studio当前的Project,否则你看不到Import Project. 选择“Import project(Eclipse ADT, Gradle, etc.)”,定位到你所需要导入的工程的主目

Android Studio创建库项目及引用

Android Studio创建库项目其实创建的是在主项目下创建Module模块,这个Module模块创建的时候选择库项目模式. 为什么要这样处理呢?因为在Android Studio中一个WorkSpace工作空间就是一个Android主项目.主项目其实也就是这个工作空间的一个Module模块,只不过这个模块是一个主模块.如果要想创建库项目,显而易见也应该是一个module模块项目,设置成Library就可以了. 然后自动生成的build.gradle文件里面会有一行标示 apply plug

Android实验一(在Android Studio中创建项目和模拟器)

北京电子科技学院(BESTI) 实     验    报     告 课程:移动平台开发         班级:1592 姓名:苏泽楠 学号:20159207 成绩:             指导教师:娄嘉鹏       实验日期:2015.10.31 实验密级:         预习程度:             实验时间:15:30-16:30 仪器组次:          必修/选修:选修        实验序号: 实验名称:在Android Studio中创建项目和模拟器 实验仪器: 名

使用Android Studio创建Android项目

创建项目 首先,在Android Studio中: Project 和 Module, Project 的真实含义是工作空间, Module 为一个具体的项目. 在 Eclipse 中,可以同时对多个 Eclipse 的 Project 进行同时编辑,这些 Project 在同一个 workspace 之中.在Android Studio中,我们可以同时对多个Android Studio的 Module 进行同时编辑,这些 Module 在同一个 Project 之中. Eclipse 的 Pr