工欲善其事,必先利其器:分享一套Code Smith 搭建N层架构模板

简介:

 开篇

平常开发时,由于冗余代码过多,程序员做重复的工作过多势必会影响开发效率。倘若对重复性代码简单的复制、粘贴,虽然也能节省时间,但也需仔细一步步替换,这无疑也是一件费力的事。这时我们急需代码生成工具,根据一套Template快速生成我们需要的代码。代码生成器原理简单,完全可以开发一套适合自己的代码生成器,一个最简单的代码生成器,有几点你需要关注下:

  1. 查询系统视图:INFORMATION_SCHEMA.TABLES、 INFORMATION_SCHEMA.COLUMNS  可以获得数据库中表、列的相关信息。
  2. 字符串的拼接:StringBuilder的使用,其AppendLine()自动换行。
  3. 将字符串写入文本文件:File.WriteAllText()
  4. 使用了部分类(partial)
  5. 使用可空类型:由于数据库中表中数据很有可能是NULL,可空类型使得数据从表中读取出来赋值给值类型更加兼容。

当然自己开发的代码生成器局限性很大,但对于小项目也是很好的选择。我也写过两篇代码生成器的拙文,仅供参考。

说起代码生成器,不得不说Code Smith,基于Template的编程,下面举例的NTier架构是很基础的,除了熟悉的三层架构,还生成了抽象工厂、缓存、单例、反射、存储过程等,当然这个Demo只是学习用,大家可以继续扩展,打造自己的铜墙铁壁。

Code Smith

CodeSmith 是一种语法类似于asp.net的基于模板的代码生成器,程序可以自定义模板,从而减少重复编码的劳动量,提高效率。Code Smith提供自定义Template,语法也不复杂,类似于asp.net的标识符号,<%%>、<%=%>、<script runat="template">...</script>

Code Smith API

N层架构-实体类模板-Entity Template

  • 首先创建一个C# template,创建指令集,导入程序集和名称空间:
复制代码
<%@ CodeTemplate  Inherits="CodeTemplate" Language="C#" TargetLanguage="Text"
 Description="NetTiers main template." Debug="True" ResponseEncoding="UTF-8"%>
<%@ Assembly Name="SchemaExplorer" %>
<%@ Assembly Name="System.Design" %>
<%@ Assembly Name="System.DirectoryServices" %>
<%@ Assembly Name="System.Web" %>
<%@ Assembly Name="System.Xml" %>

<%@ Import Namespace="SchemaExplorer" %>
<%@ Import NameSpace="System.IO" %>
<%@ Import NameSpace="System.Text" %>
<%@ Import NameSpace="System.Text.RegularExpressions" %>
<%@ Import NameSpace="System.Diagnostics" %>
<%@ Import NameSpace="System.Xml" %>
<%@ Import NameSpace="System.Xml.Xsl" %>
<%@ Import NameSpace="System.Xml.XPath" %> 
复制代码
  • 添加属性Property:
复制代码
<%--DataSourse--%>
<%@ Property Name="CurrentTable" Type="SchemaExplorer.TableSchema" Default="" Optional="False" DeepLoad="True" Category="" Description="" OnChanged="" Editor="" EditorBase="" Serializer="" %>

<%@ Property Name="RootNamespace" Default="MyOffice.Models" Type="System.String" Category="Context" Description="TargetTable that the object is based on." %>
复制代码
  • 一个简单的实体类模板内容,可以这样写:
复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace <%=this.RootNamespace%>.Entity
{
    public class <%= CurrentTable.Name%>
    {
        <% foreach(ColumnSchema col in CurrentTable.Columns)
        {%>
            public <%=col.DataType%> <%=col.Name%> {get;set;}
        <%}%>
            
    }
}
复制代码

 

当然生成实体类时,需要考虑可空类型,写好一个Template,以后爽歪歪:)。

N层架构-数据访问层接口模板,IDao Template

  • Script标签里可以自定义调用的方法,属性等。数据访问层接口大家肯定烂熟于心。
  • 常用的CRUD方法以及主表找子表,子表找主表。
  • Script里面的方法,你需要熟悉一下Code Smith的API,我在上面已经贴出了常用的API,供大家参考。

  

N层架构-抽象工厂-AbstactFactory Template

  

N层架构-DaoSqlFactory Template

  

N层架构-数据访问层-SqlProviderDao Template

  • 数据访问层(DAAB)可以使用微软企业级框架 Microsoft Enterprise Library

  

N层架构-SP存储过程-ScriptSp Template

  • 创建存储过程之前首先需要判读存储过程是否存在

 

N层架构-业务逻辑层-BLLTemplate

  • 业务逻辑层上一对多,多对一需要考虑清楚,还要考虑复合主键这类情况

  

N层架构-单例模式-DefaultProvieder Template

  • 单例+反射

 

N层架构-主模板-Main Template

  • 添加指令集
复制代码
<%@ Import NameSpace="System.Text" %>
<%@ Import NameSpace="System.Text.RegularExpressions" %>
<%@ Import NameSpace="System.Diagnostics" %>
<%@ Import NameSpace="System.Xml" %>
<%@ Import NameSpace="System.Xml.Xsl" %>
<%@ Import NameSpace="System.Xml.XPath" %> 
复制代码
  • 注册子模板
复制代码
<%@ Register Name="EntityClassTemplate" Template="Eyes.Entity.cst" MergeProperties="False" ExcludeProperties="" %>
<%@ Register Name="BizClassTemplate" Template="Eyes.Biz.cst" MergeProperties="False" ExcludeProperties="" %>
<%@ Register Name="IDALInterfaceTemplate" Template="Eyes.IDAL.cst" MergeProperties="False" ExcludeProperties="" %>
<%@ Register Name="DALFactoryTemplate" Template="Eyes.DALFactory.cst" MergeProperties="False" ExcludeProperties="" %>
<%@ Register Name="DALSqlFactoryTemplate" Template="Eyes.DALSqlFactory.cst" MergeProperties="False" ExcludeProperties="" %>
<%@ Register Name="SqlSPTemplate" Template="Eyes.SqlSp.cst" MergeProperties="False" ExcludeProperties="" %>
<%@ Register Name="DataProvider" Template="Eyes.Provider.cst" MergeProperties="False" ExcludeProperties="" %>
<%@ Register Name="DALSqlTemplate" Template="Eyes.DALSql.cst" MergeProperties="False" ExcludeProperties="" %>
<%--DataSourse--%>
<%@ Property Name="ChooseSourceDatabase" Type="SchemaExplorer.DatabaseSchema" DeepLoad="True" Optional="False" Category="01. Getting Started - Required" Description="Database that the tables views, and stored procedures should be based on. IMPORTANT!!! If SourceTables and SourceViews are left blank, the Entire Database will then be generated." %>
复制代码
  • 添加属性
复制代码
<%--DataSourse--%>
<%@ Property Name="ChooseSourceDatabase" Type="SchemaExplorer.DatabaseSchema" DeepLoad="True" Optional="False" Category="01. Getting Started - Required" Description="Database that the tables views, and stored procedures should be based on. IMPORTANT!!! If SourceTables and SourceViews are left blank, the Entire Database will then be generated." %>

<%@ Property Name="RootNamespace" Default="Net.Itcast.CN" Type="System.String" Optional="False"%>
复制代码
  • 调用Script里面的创建模板方法

 

  

小结

上面的Ntier Tempalte不是最优化的,还有很多细节需要你考虑,比如数据类型的转换:

 

 

就像我开篇所说那样,工欲善其事,必先利其器,一套好的模板可以事半功倍,我在这儿抛砖引玉,期望于君共勉,打造属于自己的铜墙铁壁。

点击下载

本博客为 木宛城主原创,基于 Creative Commons Attribution 2.5 China Mainland License发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名 木宛城主(包含链接)。如您有任何疑问或者授权方面的协商,请给我留言。
分类: 架构思想

本文转自木宛城主博客园博客,原文链接:http://www.cnblogs.com/OceanEyes/archive/2012/07/27/codeSimthTemplate.html,如需转载请自行联系原作者
目录
相关文章
|
8月前
|
存储 人工智能 缓存
AI 提示词模板相关的架构设计
现在很多企业纷纷研发大语言模型以解决业务问题。提示词在与模型交互中起到关键作用。为优化提示词模板的修改、提高渲染效率及确保安全性,架构设计注重可修改性、安全性、可靠性和性能。设计包括:将提示词存储在OSS以方便修改和版本控制;使用本地缓存提升读取性能;模板引擎增强灵活性;秘钥安全存储在加密系统中;并通过配置中心动态调整。此设计旨在提供高效、安全且可靠的AI交互体验等。
735 78
AI 提示词模板相关的架构设计
|
5月前
|
JSON 数据处理 API
Django后端架构开发:视图与模板的正确使用
Django后端架构开发:视图与模板的正确使用
53 1
|
5月前
|
JSON 数据可视化 数据格式
【Azure 环境】中国区Azure是否可以根据资源组的模板,生成一个可视化的架构图呢?
【Azure 环境】中国区Azure是否可以根据资源组的模板,生成一个可视化的架构图呢?
【Azure 环境】中国区Azure是否可以根据资源组的模板,生成一个可视化的架构图呢?
|
canal 存储 NoSQL
mysql进阶:canal搭建主从|集群架构
之前我们讲解过canal的各种应用,但是对于生产环境来讲,服务高可用是必须保证的。因此canal单节点是不能满足我们的需求的。就需要搭建canal集群。
1077 2
mysql进阶:canal搭建主从|集群架构
|
SQL 运维 算法
三高Mysql - 搭建“三高”架构之复制(上)
三高Mysql - 搭建“三高”架构之复制(上)
169 0
|
架构师 算法 Dubbo
划重点!2023面试必刷461道大厂架构面试真题汇总+面经+简历模板
在过去的一年里,LZ看到很多小伙伴在面试的时候都拿到了自己心仪的Offer,同时也在各大论坛博客平台看到了大家分享出来的面经,面试题。趁着年末时间多,公司上我手头的活基本完事了,就在业余时间把阿里,字节等大厂的Java岗面试真题为大家简单汇总了一下,一共是22个主流技术;除面试汇总外还有一份阿里七面面经与架构师简历模板,想要在金三银四面试的小伙伴可以好好看看,多少对你们有所帮助!
|
消息中间件 Java 数据处理
云计算服务架构任务池与指令池的搭建和使用,RabbitMQ消息队列
RabbitMQ具有更加灵活的路由规则,且拥有消息确认机制,所以RabbitMQ比较适合作为任务池和指令池的载体。下面将对RabbitMQ的工作原理及常用场景进行深入讲解。 RabbitMQ的内部可以分成两部分:交换机部分和消息队列部分。一般情况下,交换机和消息队列都需要手动创建,且需要使用绑定键以绑定交换机和消息队列的关系。交换机和消息队列的绑定关系可以是多对多的,绑定键可以标识多个绑定关系。
|
存储 JSON 负载均衡
快速搭建微服务架构
快速搭建微服务架构
423 3
|
关系型数据库 MySQL Linux
Mycat分布式数据库架构解决方案--搭建MySQL读写分离环境--一主多从
Mycat分布式数据库架构解决方案--搭建MySQL读写分离环境--一主多从
255 0
Mycat分布式数据库架构解决方案--搭建MySQL读写分离环境--一主多从
|
存储 机器学习/深度学习 SQL
企业如何搭建敏捷数据湖架构
“数据湖”是当前很多人、很多企业都在谈论的最新流行的话题之一。可是,让我们认真想一想,数据湖是不是像许多流行的IT词一样,很少有人真正知道如何解释它,能够实现什么价值以及如何设计和构建它。
企业如何搭建敏捷数据湖架构

热门文章

最新文章