.Net框架搭建之辅助模版代码生成工具

简介: 在.Net框架搭建讲解中,提到了代码自动生成来减少开发人员人工作量,比如数据库对应的Model、最基层的Repository类和接口等等,除了类名不一样,其他都一样,没必要再手写一遍。

在.Net框架搭建讲解中,提到了代码自动生成来减少开发人员人工作量,比如数据库对应的Model、最基层的Repository类和接口等等,除了类名不一样,其他都一样,没必要再手写一遍。
我在这里,介绍使用CodeSmith模版生成Model类,其他的都一样,拿到表名和各字段名、字段类型等等,想怎么生成就能怎么生成。

首先,在硬盘中,建立一个文件夹,用来放模版文件,比如:
F:\pukuimin\InjectExample\ExampleCodeSmithTemplate
点击添加文件夹位置,把这个文件夹加到CodeSmith管理器
这里写图片描述

好了之后,就可以新建模版文件了,在刚加的文件夹上右键,新建CS类型模版文件。
这里写图片描述

重命名为 Model.cst
内容:

<%-- 
Name:
Author: pukuimin
Description: 
--%>
<%@ Template Language="C#" TargetLanguage="C#" %>
<%@ Assembly Name="SchemaExplorer" %>
<%@ Import Namespace="SchemaExplorer" %>
<%@ Import Namespace="System.Globalization" %>
<%@ Import Namespace="System.Collections.Generic" %>
<%@ Map Name="CSharpAlias" Src="System-CSharpAlias" Description="数据库字段类型与C#类型的映射表" %>

<%-- 要打印的表 --%>
<%@ Property Name="Table"  Type="SchemaExplorer.TableSchema" DeepLoad="True" Optional="False" Category="需要的数据表" Description="table ." %>
<% 
string TableName=Table.Name;
/*
for(int i=TableName.Length-1;i>=0;i--)
{
    if(TableName[i]>='A'&& TableName[i]<='Z')
    {
        TableName=TableName.Substring(0,i)+TableName.Substring(i,1).ToLower()+TableName.Substring(i+1);
        break;
    }
}
*/
string primaryname=Table.PrimaryKey.MemberColumns[0].Name;
string primarytype= CSharpAlias[Table.PrimaryKey.MemberColumns[0].SystemType.FullName];
string autoname="",autotype="";
 foreach(ColumnSchema cs in Table.Columns) 
 {  
     if( ((bool)cs.ExtendedProperties["CS_IsIdentity"].Value) == true)
     {
        autoname=cs.Name;
        autotype=CSharpAlias[cs.SystemType.FullName];
         break;
     }
 }
List<string> fkeys=new List<string>();//存储外键列及对应的主键表名
foreach(var item in Table.ForeignKeys)
{
    fkeys.Add(item.ForeignKeyMemberColumns[0].Name);
    //Response.Write(item.ForeignKeyMemberColumns[0].Name+"--"+item.PrimaryKey.Table.Name+"\n"); 
}
%>
/* ==============================================================================
 * 功能描述:SysUserInfo  
 * 创 建 者:蒲奎民
 * 创建日期:2016-08-29 15:58:13
 * CLR Version :4.0.30319.42000
 * ==============================================================================*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace InjectExample.Model
{
    public partial class <%=Table.Name%>
    {
             <% for(int i=0;i<Table.Columns.Count;i++) {
             ColumnSchema col=Table.Columns[i];
             string temptype=CSharpAlias[col.SystemType.FullName];             
              %>
        /// <summary>
        /// <%=col.Description==""?col.Name:col.Description %>
        /// </summary>
        public <%=temptype+(col.AllowDBNull&&temptype!="string"?"?":"")%> <%=col.Name%> { get; set; }

                <%

                }
                %>
    }
}

保存,然后,点击工具栏的Build Template,生成一下。
右下角会有选择数据库表,我们就需要添加数据库。
这里写图片描述
添加数据库,再选择库中的一张表。
这里写图片描述
选择好了之后,点击工具栏的 Generate 生成model内容了。
这里写图片描述
生成的内容:
这里写图片描述
这个代码就能直接使用了,如果不能用,要自己改改模版。

其他模版不一一介绍,大家可以参考此模版改造。

再加一个,把模版生成的代码直接保存到文件的CS模版。
这里写图片描述

模版内容:

<%-- 
Name:GenerateFiles.cst
Author: pukuimin
Description: 生成并输出cs文件的模版
--%>
<%@ Template Language="C#" TargetLanguage="Text" Inherits="CodeTemplate" Encoding="utf-8"%>
<%@ Assembly Name="SchemaExplorer"%>
<%@ Import Namespace="SchemaExplorer"%>

<%-- 数据库 --%>
<%@ Property Name="SourceDatabase"  Type="SchemaExplorer.DatabaseSchema" DeepLoad="True" Optional="False" Category="需要的数据库" Description="Database"%>
<%-- 注册实体层Model模板 --%>
<%@ Register Name="ModelTemplate" Template="Model.cst" MergeProperties="Flase" ExcludeProperties=""%>
<script runat="template">
    //解决方案输出路径
     private string Directory = String.Empty;
    [Editor(typeof(System.Windows.Forms.Design.FolderNameEditor), typeof(System.Drawing.Design.UITypeEditor))]   
    [Optional, NotChecked]
    [DefaultValue("")]
    public string OutputDirectory 
    { 
        get
        {
            return Directory;
        }
        set
        {
            if (value.EndsWith("\\")) value = value.Substring(0, value.Length -1);
            Directory = value;
        } 
    }
    public string GetSubspace(string tableName)
    {

        for(int i=tableName.Length-1;i>=0;i--)
        {
            if(tableName[i]>='A'&& tableName[i]<='Z')
            {
                tableName=tableName.Substring(0,i)+tableName.Substring(i,1).ToLower()+tableName.Substring(i+1);
                break;
            }
        }
        return tableName;
    }
        //生成实体Entity类
    private void GenerateEntityClasses()
    {
        CodeTemplate modelTemplate =new ModelTemplate();


        foreach(TableSchema table in this.SourceDatabase.Tables)
        {
            string TableName=table.Name;
            string subspace=GetSubspace(TableName);
            if(TableName!="") continue;//可以指定只生成一个表,不等于这个表名就跳过生成,为空就生成所有表
            //#error 上面行修改成要生成的表名(修改后可注释本行)
            Response.WriteLine("……………………"+TableName +" 开始生成……………………");

            string modelDirectory = OutputDirectory +"\\InjectExample.Model\\"+TableName+".cs";

            //生成Model.cs模板文件
            modelTemplate.SetProperty("Table",table);
            modelTemplate.RenderToFile(modelDirectory,true);//文件输出
            Response.WriteLine(modelDirectory +" 创建成功.");

            Response.WriteLine("……………………"+TableName +" 完成生成……………………");
        }
    }
</script>
<%
    //创建实体层Entity类
    this.GenerateEntityClasses();
    Debug.WriteLine("全部生成完成!");
    Response.WriteLine("全部生成完成!");
%>

点击生成之后,在你选择的目录下,就直接生成了Model.cs文件,连创建新文件都省了。

版权声明:
作者:真爱无限
出处:http://blog.csdn.net/pukuimin1226/
本文为博主原创文章版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接.

相关文章
|
4天前
|
XML C# 数据格式
一个.NET开源、免费、功能强大的 PDF 处理工具
一个.NET开源、免费、功能强大的 PDF 处理工具
|
4天前
|
网络协议 C#
基于.NET WinForm开发的一款硬件及协议通讯工具
基于.NET WinForm开发的一款硬件及协议通讯工具
|
4天前
|
C# UED
一个.NET开源、易于使用的屏幕录制工具
一个.NET开源、易于使用的屏幕录制工具
|
4天前
|
Web App开发 C# Windows
一款.NET开源的Windows资源管理器标签页工具
一款.NET开源的Windows资源管理器标签页工具
|
4天前
|
监控 前端开发 API
一款基于 .NET MVC 框架开发、功能全面的MES系统
一款基于 .NET MVC 框架开发、功能全面的MES系统
|
23天前
|
消息中间件 开发框架 监控
NET任务调度框架Hangfire使用指南
Hangfire 是一个用于 .NET 应用程序的开源任务调度框架,支持长时间运行任务、定时任务等。通过简单的安装配置,即可将任务从主线程分离,提升应用性能。支持多种数据库,提供丰富的任务类型如立即执行、延迟执行和周期性任务,并有可视化管理界面 Hangfire Dashboard。还支持安全性配置及扩展插件,如 Hangfire.HttpJob,适合各种复杂场景下的任务调度需求。
47 1
NET任务调度框架Hangfire使用指南
|
2月前
|
开发框架 安全 .NET
在数字化时代,.NET 技术凭借跨平台兼容性、丰富的开发工具和框架、高效的性能及强大的安全稳定性,成为软件开发的重要支柱
在数字化时代,.NET 技术凭借跨平台兼容性、丰富的开发工具和框架、高效的性能及强大的安全稳定性,成为软件开发的重要支柱。它不仅加速了应用开发进程,提升了开发质量和可靠性,还促进了创新和业务发展,培养了专业人才和技术社区,为软件开发和数字化转型做出了重要贡献。
31 5
|
2月前
|
传感器 人工智能 供应链
.NET开发技术在数字化时代的创新作用,从高效的开发环境、强大的性能表现、丰富的库和框架资源等方面揭示了其关键优势。
本文深入探讨了.NET开发技术在数字化时代的创新作用,从高效的开发环境、强大的性能表现、丰富的库和框架资源等方面揭示了其关键优势。通过企业级应用、Web应用及移动应用的创新案例,展示了.NET在各领域的广泛应用和巨大潜力。展望未来,.NET将与新兴技术深度融合,拓展跨平台开发,推动云原生应用发展,持续创新。
46 4
|
2月前
|
开发框架 .NET C#
.NET 技术凭借高效开发环境、强大框架支持及跨平台特性,在软件开发中占据重要地位
.NET 技术凭借高效开发环境、强大框架支持及跨平台特性,在软件开发中占据重要地位。从企业应用到电子商务,再到移动开发,.NET 均展现出卓越性能,助力开发者提升效率与项目质量,推动行业持续发展。
36 4
|
2月前
|
消息中间件 监控 数据可视化
基于.NET开源、功能强大且灵活的工作流引擎框架
基于.NET开源、功能强大且灵活的工作流引擎框架