`
pcajax
  • 浏览: 2159315 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

插件开发 之 生成代码

阅读更多
插件开发 之 生成代码

三个步骤了解插件开发:

    步骤一:了解插件开发接口

 
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ZM.PH.PlugInInterface
{
    
/// <summary>
    
/// 表示生成代码的接口。
    
/// </summary>
    
/// <remarks>欲了解此接口,请参考PlugIns项目中的Demo_GenCode.cs</remarks>
    public interface IGenSymLanguage
    {
        
/// <summary>
        
/// 获取 代码层的集合,将从此获取生成的代码相关信息(详见 GenCodeLayer.cs)。
        
/// </summary>
        List<GenCodeLayer> CodeLayers { get; }

        
/// <summary>
        
/// 获取代码层相关命名规则(类Namespace和类名称规则),即告诉客户默认的代码层命名规则,请从 CodeLayers获取生成结果。
        
/// </summary>
        void GetNamingRules();

        
/// <summary>
        
/// 根据用户设置的代码层命名规则为某一具体数据表生成代码层命名实例(类Namespace和类名称),请从CodeLayers获取生成结果。
        
/// </summary>
        
/// <param name="table">表示数据表的对象</param>
        void GetNamingRules(IDBTable table);

        
/// <summary>
        
/// 生成代码。
        
/// </summary>
        
/// <param name="table">表示当前要生成代码的数据表(请了解IDBTable及其它数据库对象的结构)</param>
        
/// <remarks>
        
///     获取当前表所有数据列:IDBTable.Columns
        
///     获取与当前表关联的存储过程:IDBProcedure.AssociatedTable = IDBTable
        
/// </remarks>
        void Gen(IDBTable table);

        
/// <summary>
        
/// 清除所有不需要的对象。
        
/// </summary>
        void ClearAllUnused();
    }
}

    步骤二:了解数据库对象实体


1. 项目PlugInInterface/IEntities 为数据库实体接口。
2. 项目PlugInInterface/DBEntities 抽象出数据库实体对象,继承数据库实体接口,同时也是其它具体数据库实体的基类。
3. 项目PlugIns/Entities_Sqlserver 为Sqlserver数据库实现的数据库实体对象,分别继承自PlugInInterface/DBEntities。
4. 项目PlugIns/Entities_SQLite 为Sqlite数据库实现的数据库实体对象,分别继承自PlugInInterface/DBEntities。
5. 项目PlugIns/Entities_MySql 为MySql数据库实现的数据库实体对象,分别继承自PlugInInterface/DBEntities。
6. PamProgram及所有子类 为初始化相关插件提供的构造器参数。

    步骤三:看一个简单的插件Demo

 
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using ZM.PH.PlugInInterface;

namespace ZM.PH.PlugIns
{
    
/// <summary>
    
/// 生成代码演示,以petshop架构为例。
    
/// </summary>
    [PluginInfo("2bf2331c-d7e3-4b9b-aaab-9b5ca8c8787f""插件开发Demo""1.0.0.0""版权所有(2005-2008) mrhgw""mrhgw""http://www.mrhgw.cn""生成代码示例插件(仿petshop结构), 仅提供插件开发者进行参考。")]
    
public class Demo_GenCode : IGenSymLanguage
    {
        
#region 构造器

        
/// <summary>
        
/// 构造器。
        
/// </summary>
        
/// <param name="_pamProgram">生成代码所需的参数类</param>
        public Demo_GenCode(PamProgram_GenSymLanguage _pamProgram)
        {
            
this.pamProgram = _pamProgram;
        }

        
#endregion

        
#region 变量

        
/// <summary>
        
/// 生成代码所需的参数类。
        
/// </summary>
        private PamProgram_GenSymLanguage pamProgram = null;
        
/// <summary>
        
/// 代码层的集合。
        
/// </summary>
        private List<GenCodeLayer> _codeLayers = new List<GenCodeLayer>();

        
#endregion

        
#region 静态对象

        
/// <summary>
        
/// 分层代码的关键字(仿petshop结构)。
        
/// </summary>
        public enum CodeLayerKeys
        {
            Model,
            IDAL,
            DAL,
            DALFactory,
            BLL
        }

        
#endregion

        
#region IGenSymLanguage 成员

        
/// <summary>
        
/// 获取 代码层的集合,将从此获取生成的代码相关信息(详见 GenCodeLayer.cs)。
        
/// </summary>
        public List<GenCodeLayer> CodeLayers
        {
            
get { return this._codeLayers; }
        }

        
/// <summary>
        
/// 获取代码层相关命名规则(类Namespace和类名称规则),即告诉客户默认的代码层命名规则,请从 CodeLayers获取生成结果。
        
/// </summary>
        public void GetNamingRules()
        {
            
/*以下以petshop为例,告诉客户默认的类命名和命名空间规则。
             *  命名空间规则为(Namespace):
             *   层Model:YouProject.Model
             *   层IDAL:YouProject.IDAL
             *   层DAL:YouProject.DAL
             *   层DALFactory:YouProject.DALFactory
             *   层BLL:YouProject.BLL
             * 
             *  类命名规则为(Class Name,<T>表示数据表名称):
             *   层Model:<T>Info
             *   层IDAL:I<T>
             *   层DAL:<T>
             *   层DALFactory:DataAccess
             *   层BLL:<T>
             
*/

            
//清空。
            this._codeLayers.Clear();

            
foreach (string _name in Enum.GetNames(typeof(CodeLayerKeys)))
            {
                CodeLayerKeys _en 
= (CodeLayerKeys)Enum.Parse(typeof(CodeLayerKeys), _name);
                
//初始化代码层对象。
                GenCodeLayer gcLayer = new GenCodeLayer(_name);

                
//特别说明:<T>表示数据表名称;<DB>表示数据库名称。
                switch (_en)
                {
                    
case CodeLayerKeys.Model:
                        gcLayer.ClassName 
= "<T>Info";
                        gcLayer.Namespace 
= "YouProject.Model";
                        
break;
                    
case CodeLayerKeys.IDAL:
                        gcLayer.ClassName 
= "I<T>";
                        gcLayer.Namespace 
= "YouProject.IDAL";
                        
break;
                    
case CodeLayerKeys.DAL:
                        gcLayer.ClassName 
= "<T>";
                        gcLayer.Namespace 
= "YouProject.DAL";
                        
break;
                    
case CodeLayerKeys.DALFactory:
                        gcLayer.ClassName 
= "DataAccess";
                        gcLayer.Namespace 
= "YouProject.DALFactory";
                        
break;
                    
case CodeLayerKeys.BLL:
                        gcLayer.ClassName 
= "<T>";
                        gcLayer.Namespace 
= "YouProject.BLL";
                        
break;
                }

                
this._codeLayers.Add(gcLayer);
            }
        }

        
/// <summary>
        
/// 根据用户设置的代码层命名规则为某一具体数据表生成代码层命名实例(类Namespace和类名称),请从CodeLayers获取生成结果。
        
/// </summary>
        
/// <param name="table">表示数据表的对象</param>
        public void GetNamingRules(IDBTable table)
        {
            
//清空。
            this._codeLayers.Clear();

            
foreach (string _name in Enum.GetNames(typeof(CodeLayerKeys)))
            {
                CodeLayerKeys _en 
= (CodeLayerKeys)Enum.Parse(typeof(CodeLayerKeys), _name);
                
//初始化代码层对象。
                GenCodeLayer gcLayer = new GenCodeLayer(_name);

                
//获取类的命名规则。
                
//this.pamProgram.ClassNamingRules 是用户确定的命名规则。
                string classNamingRule = this.GetValueByKey(this.pamProgram.ClassNamingRules, _name);
                
//将表示为数据表的特殊字符串<T>替换为表名称(此处可能还需要去除表前缀,大写小格式化等,有需要自己添加)。
                classNamingRule = classNamingRule.Replace("<T>", table.Name);

                
//获取类命名空间的命名规则。
                
//this.pamProgram.NamespaceNamingRules 是用户确定的命名空间规则。
                string nsNamingRule = this.GetValueByKey(this.pamProgram.NamespaceNamingRules, _name);
                
//将表示为数据库的特殊字符串<DB>替换为数据库名称。
                nsNamingRule = classNamingRule.Replace("<DB>", table.OwnerDB.Name);


                gcLayer.ClassName 
= classNamingRule; //设置类名称。
                gcLayer.Namespace = nsNamingRule; //设置类的命名空间。
                gcLayer.SymLanguage = SymLanguages.CSharp; //代码语言类别。
                gcLayer.FileExtension = ".cs"//设置类保存为文件的扩展名。

                
//确定DALFactory层的代码不需要保存为一个独立的文件。
                
//Petshop中,所有反射创建数据访问对象是统一保存为一个文件,不要每个表独立保存为一个文件的。
                if (_en == CodeLayerKeys.DALFactory)
                    gcLayer.IndependentSave 
= false;
                
//加入集合中。
                this._codeLayers.Add(gcLayer);
            }
        }

        
/// <summary>
        
/// 生成代码。
        
/// </summary>
        
/// <param name="table">表示当前要生成代码的数据表(请了解IDBTable及其它数据库对象的结构)</param>
        
/// <remarks>
        
///     获取当前表所有数据列:IDBTable.Columns
        
///     获取与当前表关联的存储过程:IDBProcedure.AssociatedTable = IDBTable
        
/// </remarks>
        public void Gen(IDBTable table)
        {
            
//清空。
            this._codeLayers.Clear();

            
foreach (string _name in Enum.GetNames(typeof(CodeLayerKeys)))
            {
                CodeLayerKeys _en 
= (CodeLayerKeys)Enum.Parse(typeof(CodeLayerKeys), _name);
                
//初始化代码层对象。
                GenCodeLayer gcLayer = new GenCodeLayer(_name);

                
//获取类的命名规则。
                string classNamingRule = this.GetValueByKey(this.pamProgram.ClassNamingRules, _name);
                
//将表示为数据表的特殊字符串<T>替换为表名称(此处可能还需要去除表前缀,大写小格式化等,有需要自己添加)。
                classNamingRule = classNamingRule.Replace("<T>", table.Name);

                
//获取类命名空间的命名规则。
                string nsNamingRule = this.GetValueByKey(this.pamProgram.NamespaceNamingRules, _name);
                
//将表示为数据库的特殊字符串<DB>替换为数据库名称。
                nsNamingRule = classNamingRule.Replace("<DB>", table.OwnerDB.Name);


                gcLayer.ClassName 
= classNamingRule; //设置类名称。
                gcLayer.Namespace = nsNamingRule; //设置类的命名空间。
                gcLayer.SymLanguage = SymLanguages.CSharp; //代码语言类别。
                gcLayer.FileExtension = ".cs"//设置类保存为文件的扩展名。

                
//设置生成的代码,本插件最核心的功能在此实现。
                
//此示例为demo,真实插件需要根据业务编写更为复杂的代码。
                gcLayer.Code = "hollow!这是代码层 " + _name + " 的代码。"

                
//确定DALFactory层的代码不需要保存为一个独立的文件。
                
//Petshop中,所有反射创建数据访问对象是统一保存为一个文件,不要每个表独立保存为一个文件的。
                if (_en == CodeLayerKeys.DALFactory)
                {
                    gcLayer.BittyCodeReplacemen 
= "//{@#@*%*}"//设置片断代码替换标记,请注意在以上代码中的字符串{@#@*%*}即为 BittyCodeReplacemen。
                    gcLayer.IndependentSave = false//设置为不能独立保存。
                }

                
//加入集合。
                this._codeLayers.Add(gcLayer);
            }
        }

        
/// <summary>
        
/// 清除所有不需要的对象。
        
/// </summary>
        public void ClearAllUnused()
        {
            
if (null != this._codeLayers)
                
this._codeLayers.Clear();
        }

        
#endregion        

        
#region 私有的方法

        
/// <summary>
        
/// 根据键从集合中获取对象。
        
/// </summary>
        
/// <param name="sd">SortedList</param>
        
/// <param name="key">要查找的键</param>
        
/// <returns></returns>
        private string GetValueByKey(SortedList<stringstring> sd, string key)
        {
            
foreach (string _key in sd.Keys)
            {
                
if (_key == key)
                    
return sd[_key];
            }

            
return null;
        }

        
#endregion
    }
}

插件开发详细说明:

1. 下载插件开发源代码,点击下载
2. 插件开发源代码简介:
    数据库实体接口对象:PlugInInterface/IEntities
    数据库实体对象:PlugInInterface/DBEntities
    生成码插件接口:PlugInInterface/IActions/IGenSymLanguage.cs
    生成代码插件demo:PlugIns/GenSymLanguages/生成代码示例/Demo_GenCode.cs
3. 创建解决方案。打开Visual Studio创建空白解决方案,然后依次添加现有项目Common、PlugInInterface(依赖于Common层)和PlugIns(依赖于PlugInInterface和Common层)。
4. 开发新插件。如果你要开发新的插件,建议创建一新项目,添加对Common和PlugInInterface的引用,然后根据Demo(Demo_GenCode.cs)创建新插件。
5. 安装插件。插件创建完成编译通过,然后打开主程序,从工具栏依次打开 工具栏 --> 工具箱 --> 安装新插件,打开新插件所在目录并选择编译的dll,系统会自动扫描到新插件。
6. 应用插件。从工具栏依次打开 系统配置 --> 创建新方案 或 打开已有的方案 --> 生成代码,插件列表中将会显示刚刚安装的插件,请选择该插件并完成页面下方的相关配置,点“完成”完成配置并载入当前方案。
7. 生成代码。 载入当前方案,从右边数据表列表中选择某一数据表,弹出右键菜单创建相关功能的存储过程(如果已有存储过程略过),从右边数据表列表中选择某一数据表,右键“生成代码”或从工具栏的“生成代码 --> 从当前表生成代码”生成代码。
8. 代码写入项目。 在生成代码页面,从工具栏上选择“保存代码 --> 当前代码写入项目 或 所有代码写入项目”。如果要重新设置代码写入路径,请从工具栏上进入“系统配置 --> [你当前方案] --> 生成代码,页面下方设置代码保存路径”,点完成重新载入当前方案。

开发插件所需的相关对象:

1. 数据表(IDBTable.cs),数据列(IDBColumn.cs)
2. 与当前数据表关联的存储过程(通过IDBProcedure的AssociatedTable获取),存储过程成员(IDBMember.cs)。
3. 与当前表建立外键关系的其它表(能过IDBTable的Fks、Rks获取)。
4. 视图(IDBView.cs)。

存储过程标签定义说明:

1. Execute
    命令执行方式,选择有ExecuteNonQuery,ExecuteScalar和ExecuteReaderOrDataSet。
2. SPType
    存储过程类别,选择有Insert(添加数据),Update(更新),UpdateByPrimary(以主键更新),Delete(删除数据),DeleteByPrimary(以主键删除数据),Select(获取数据),SelectByPrimary(以主键获取数据),SelectPaging(分页获取数据)。
3. Table
    当前存储过程所关联的数据表,即当前存储过程将作为为该数据表生成代码中的一个方法。
4. Description
    存储过程的说明。
5. MultiDataSource
    表示当前存储过程将返回多个数据集,以便程序作出特别处理。
特别提示:通过IDBProcedure来获取存储过程通过标签定义的特性。
分享到:
评论

相关推荐

    Eclipse代码生成器插件开发

    Eclipse代码生成器插件开发 在本节中,我们将探讨Eclipse代码生成器插件开发的相关知识点。 一、插件开发基本概念 在Eclipse中,插件是一种可以扩展Eclipse功能的组件。插件可以提供新的功能、视图、编辑器等。要...

    java插件配置代码生成器

    总的来说,Java插件配置代码生成器是Java插件开发中的一个重要辅助工具,它通过自动化的方式解决了配置代码的编写问题,让开发者更专注于业务创新和功能实现,提高软件开发的效率和质量。对于大型项目或复杂插件系统...

    mybatis代码生成插件

    在实际开发中,MyBatis Code Generator插件还可以与其他工具集成,比如IDEA、Eclipse等集成开发环境,通过插件的形式提供图形化的配置界面,使得生成代码更加便捷。此外,你还可以通过调整generatorConfig.xml中的...

    MyBatis通用插件自动生成代码器

    MyBatis通用插件自动生成代码器是一种高效实用的开发工具,主要针对MyBatis框架进行设计,旨在简化开发过程中的代码编写工作。通过这款插件,开发者可以快速地生成与数据库表对应的实体类(Entity)、接口(Mapper)...

    mybatis自动生成代码 eclipse插件

    在Java Web开发中,MyBatis Generator是开发者不可或缺的工具之一。 **一、MyBatis Generator介绍** MyBatis Generator(MBG)是MyBatis框架的一个扩展,它允许开发者通过简单的配置文件定义,自动生成与数据库...

    mybatis代码自动生成插件

    配置完成后,就可以在项目中选择需要生成代码的表,插件会根据表结构自动生成对应的代码。通常,它会生成以下几部分: 1. **实体类(Entity)**:根据表字段生成Java对象,包含了字段属性和getter/setter方法。 2. ...

    inkscape生成代码插件,inkscape实心填充插件,以及插件使用教程_

    在本资源包中,我们关注的是Inkscape的两个重要插件:一个是用于生成G代码的插件,另一个是实心填充插件。Inkscape是一款开源的矢量图形编辑工具,广泛应用于图形设计、图标制作和工程绘图等领域。通过这些插件,...

    MybatisPlus 超好用的idea代码生成插件

    - **合理划分模块**:在项目结构设计时,提前规划好各层代码的存放位置,以便于插件生成代码后能正确放入对应目录。 - **保持数据库和代码同步**:当数据库表结构发生变化时,及时使用插件更新代码,避免手动修改...

    tinyMCE插件开发之插代码高亮 v1.0.rar

    总的来说,“tinyMCE插件开发之插代码高亮 v1.0”是提高TinyMCE编辑器功能的一个实用解决方案,它利用SyntaxHighlighter的代码高亮能力,使得在富文本编辑器中查看和编辑代码变得更加便捷和直观。对于那些经常需要在...

    maven 代码生成(maven插件)

    在本场景中,我们关注的是"Maven代码生成"插件,特别是"MyBatis Generator"。 MyBatis Generator(MBG)是一个强大的工具,用于自动生成MyBatis的SQL映射文件,DAO接口和实现,以及实体类。通过这个插件,开发者...

    axis2支持webservice 自动生成代码客户端服务端代码插件

    标题提及的“axis2支持webservice 自动生成代码客户端服务端代码插件”,是指Apache Axis2为Eclipse IDE提供的一套工具,旨在简化Web服务的开发流程。这个插件允许开发者通过WSDL(Web Services Description ...

    IDEA 插件 Easycode代码生成器详解.doc

    使用 Easycode 插件可以自动生成代码,无需手动编写代码,减少了开发人员的工作量。 * 提高工作效率。Easycode 插件可以快速生成代码,提高了工作效率。 * 简化开发过程。使用 Easycode 插件可以简化开发过程,减少...

    swift-一款Xcode合法插件EasyCode快速生成代码

    1. **模板化代码生成**:EasyCode可能提供了一系列预定义的代码模板,开发者可以根据需求选择合适的模板,一键生成代码,如初始化方法、网络请求、数据模型等。 2. **自定义扩展**:除了内置模板,EasyCode可能允许...

    Mybatis Plus代码生成器 IDEA 插件版 (版本v0.0.6)

    Mybatisplus 代码生成器提供 Windows Desktop 和 IDEA Plugin 两个版本。 我的IDEA是2019.2版本的,没有...生成springboot工程,集成常用框架,快速开发 3.导出XMind思维导图 4.导出Excel数据库设计文档 5.励志提示

    IBatis-Abator插件自动生成代码和配置的方法

    通过myEclipse下的IBatis-Abator插件来自动生成代码和配置不仅能够显著提高开发效率,还能保证生成的代码质量。然而,在享受便捷的同时也需要注意对生成代码进行必要的审查和优化,以满足项目需求。希望本文能帮助...

    wsdl first开发web service(maven插件自动生成代码)

    “WSDL First开发Web Service (Maven插件自动生成代码)” 主要涉及的是基于Web Service的开发方法,其中WSDL First是指先定义服务接口的Web Services Description Language(WSDL)文档,然后根据该文档自动生成...

    mybatis-generator插件 自动生成代码和注解

    下面将详细阐述MBG的主要功能、工作原理以及如何使用它来生成代码和注解。 1. **主要功能**: - **自动生成Mapper XML文件**:MBG可以根据数据库表结构自动生成对应的Mapper XML文件,包括增删改查(CRUD)等基本...

    eclipse android 代码生成插件源码

    6. 提供用户友好的交互界面,允许用户选择要生成代码的视图或对象。 通过学习这个插件的源码,开发者不仅可以提高自己的编程效率,还能深入理解Android插件开发,包括Eclipse插件API的使用、XML解析、代码生成等...

Global site tag (gtag.js) - Google Analytics