
昨天发布了.net项目开发工具(v3.0),这是一次比较大的改版(系统结构、界面)。从发布到现在,收到不少热心朋友的反馈,其中有褒有贬,其中有争议的是在界面布局和使用习惯上,而最主要的是很多人认为不喜欢我生成的代码和无法定制代码。其实,不知道是我没有表达清楚还是他们没有仔细看文章,在文章的“扩展”一节,略交待了系统扩展方面的事宜。看来,有必要详细介绍关于系统扩展方面的信息。
轻松定制你的代码 -- .net项目开发工具(v3.0)
昨天发布了.net项目开发工具(v3.0),这是一次比较大的改版(系统结构、界面)。从发布到现在,收到不少热心朋友的反馈,褒贬不一,其中有争议的在界面布局和使用习惯上,而最主要的是很多人不喜欢我生成的代码以及认为无法定制自己的代码。其实,不知道是我没有表达清楚还是他们没有仔细看文章,在文章的“扩展”一节,略交待了系统扩展方面的事宜。看来,有必要详细介绍关于系统扩展方面的信息。
根据功能定义目前系统共支持四种类型的接口:
1).数据访问接口,以实现不同类型、版本的数据库访问。
2).生成SQL脚本,以方便针对不同类型、版本的数据库生成SQL代码。
3).生成程序代码接口,根据使用者或项目要求,定制自己的代码。
4).生成其它类型的代码,可生成其它代码。
以下为相关接口代码 ------------------------------------------------------------------------------------
1).IDataAccess

Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

using ZM.PH.Common;

namespace ZM.PH.PlugInInterface


{

/**//// <summary>
/// 数据访问的接口。
/// </summary>
public interface IDataAccess

{


事件#region 事件


/**//// <summary>
/// 载入存储过程进度发生变化的事件。
/// </summary>
event ProgressChangedEventHandler ProcedureLoadProgressChanged;

#endregion


根据指定的实体类型创建实体对象#region 根据指定的实体类型创建实体对象


/**//// <summary>
/// 根据指定的实体类型创建实体对象。
/// </summary>
/// <param name="t">实体接口类型</param>
/// <returns>获取实现了接定接口类型的对象实例</returns>
IDBObjectBase CreateEntity(Type t);

#endregion


获取数据库结构相关信息#region 获取数据库结构相关信息


/**//// <summary>
/// 获取 当前DB对象。
/// </summary>

IDB DB
{ get; }


/**//// <summary>
/// 获取当前数据库的名称和所有数据表并填充数据。
/// </summary>
/// <param name="tableFilters">数据表过滤规则</param>
IDB FillDB();


/**//// <summary>
/// 获取某一数据表的结构并填充数据。
/// </summary>
/// <param name="dbTable">DBTable实例对象</param>
/// <returns></returns>
void FillTableScheme(IDBTable dbTable);


/**//// <summary>
/// 获取所有的存储过程。
/// </summary>
/// <returns>存储过程对象集合</returns>
EntityList<IDBProcedure> GetProcedures();


/**//// <summary>
/// 填充存储过程的相关信息。
/// </summary>
/// <param name="_procedure">存储过程对象</param>
void FillProcedureScheme(IDBProcedure _procedure);


/**//// <summary>
/// 获取所有视图。
/// </summary>
/// <returns></returns>
EntityList<IDBView> GetViews();


/**//// <summary>
/// 填充视图相关信息。
/// </summary>
/// <param name="_view">视图对象</param>
void FillViewScheme(IDBView _view);


/**//// <summary>
/// 获取所有自定义函数。
/// </summary>
/// <returns></returns>
EntityList<IDBFunction> GetFunctions();


/**//// <summary>
/// 填充自定义函数的相关信息。
/// </summary>
/// <param name="_function">自定义函数对象</param>
void FillFunctionScheme(IDBFunction _function);


/**//// <summary>
/// 获取当前数据库中所有的系统数据类型。
/// </summary>
/// <returns></returns>
List<string> GetAllDataTypes();

#endregion


执行数据库查询#region 执行数据库查询


/**//// <summary>
/// 测试数据库连接。
/// </summary>
/// <returns></returns>
bool TestDBConnection();


/**//// <summary>
/// 判断某对象是否存在。
/// </summary>
/// <param name="objectFullName">对象完整名称</param>
/// <returns></returns>
bool DBObjectExists(string objectFullName);


/**//// <summary>
/// 执行某段SQL脚本,根据需要是否弹出确认对话框询问是否覆盖。
/// </summary>
/// <param name="sqlText">SQL脚本</param>
/// <param name="saveConfirmed">当对象存在以后,是否弹出对话框确认删除该对象</param>
/// <param name="messages">执行操作的消息</param>
/// <param name="dbObjects">执行SQL时受影响的数据库对象集合</param>
/// <returns>DataSet数据集</returns>
DataSet ExecSQL(string sqlText, bool saveConfirmed, List<string> messages, List<IDBObjectBase> dbObjects);


/**//// <summary>
/// 分析SQL语法。
/// </summary>
/// <param name="sqlText">SQL</param>
void AnalyseSQL(string sqlText);


/**//// <summary>
/// 调试存储过程。
/// </summary>
/// <param name="procedure">存储过程对象</param>
DataSet DebugProcedure(IDBProcedure procedure);


/**//// <summary>
/// 移除数据表。
/// </summary>
/// <param name="tables">表集合</param>
void DropTables(List<IDBTable> tables);


/**//// <summary>
/// 移除存储过程。
/// </summary>
/// <param name="procedures">存储过程对象集合</param>
void DropProcedures(List<IDBProcedure> procedures);


/**//// <summary>
/// 移除视图。
/// </summary>
/// <param name="views">视图对象集合</param>
void DropViews(List<IDBView> views);


/**//// <summary>
/// 移除自定义函数。
/// </summary>
/// <param name="functions"></param>
void DropFunctions(List<IDBFunction> functions);


/**//// <summary>
/// 获取某一数据表的数据。
/// </summary>
/// <param name="tableFullName">数据表完整名称</param>
/// <param name="top">前n条数据,如果小于或等于0,表示获取全部数据</param>
/// <param name="dataCount">数据总量</param>
/// <returns></returns>
IDataReader GetData(string tableFullName, int top, ref int dataCount);

#endregion
}
}

2).IGenSymLanguage

Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ZM.PH.PlugInInterface


{

/**//// <summary>
/// 生成程序语言的接口。
/// </summary>
public interface IGenSymLanguage : IDisposable

{

/**//// <summary>
/// 预生成。
/// </summary>
/// <remarks>
/// 1.并非真正的生成代码。
/// 2.仅告诉客户将要生成的代码层数,根据类命名规则生成类名称和命名空间名称。
/// </remarks>
/// <param name="table">数据表对象(如果为空,表示仅需要获取将要生成的代码层数)</param>
/// <returns></returns>
List<GenCodeLayer> PreRender(IDBTable table);

/**//// <summary>
/// 生成代码。
/// </summary>
/// <param name="table">将要生成代码的数据表对象</param>
/// <returns></returns>
List<GenCodeLayer> Gen(IDBTable table);
}
}

关联类:GenCodeLayer

Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ZM.PH.PlugInInterface


{

/**//// <summary>
/// 生成分层代码的描述。
/// </summary>
public class GenCodeLayer

{

/**//// <summary>
/// 构造器(默认)。
/// </summary>
public GenCodeLayer()

{

}


/**//// <summary>
/// 构造器(重载二)。
/// </summary>
/// <param name="_caption">标题</param>
public GenCodeLayer(string _caption)

{
this.Caption = _caption;
}


变量#region 变量


/**//// <summary>
/// 是否能独立保存代码。
/// </summary>
private bool _independentSave = true;

#endregion


属性#region 属性


/**//// <summary>
/// 获取或设置 标题。
/// </summary>

public string Caption
{ get; set; }


/**//// <summary>
/// 获取或设置 类名称。
/// </summary>

public string ClassName
{ get; set; }


/**//// <summary>
/// 获取或设置 命名空间。
/// </summary>

public string Namespace
{ get; set; }


/**//// <summary>
/// 获取或设置 完整的代码。
/// </summary>

public string Code
{ get; set; }


/**//// <summary>
/// 获取或设置 片断代码。
/// </summary>
/// <remarks>
/// 1.不包括类和命名空间声明的片断代码,区别于完整代码(完整代码包含片断代码部分)。
/// 2.用于批量代码生成。
/// </remarks>

public string BittyCode
{ get; set; }


/**//// <summary>
/// 获取或设置 用于替换片断代码的标签对象。
/// </summary>

public string BittyCodeReplacemen
{ get; set; }


/**//// <summary>
/// 获取或设置 是否能独立保存代码。
/// </summary>
/// <remarks>
/// 有些代码可以独立保存,有些不能(比如PetShop结构中的数据访问工厂类)。
/// 对于使用了片断代码的,一般不会独立保存。
/// </remarks>
public bool IndependentSave

{

get
{ return this._independentSave; }

set
{ this._independentSave = value; }
}


/**//// <summary>
/// 获取或设置 程序语言类别。
/// </summary>

public SymLanguages SymLanguage
{ get; set; }


/**//// <summary>
/// 获取或设置 生成代码保存文件的扩展名(如 .cs,请务必带符号.)。
/// </summary>
/// <remarks>
/// 本来可以根据程序语言类别进行判断,但考虑到灵活性还是要求用户自己设置。
/// </remarks>

public string FileExtension
{ get; set; }

#endregion


重载方法#region 重载方法

public override string ToString()

{
return this.Caption;
}

#endregion
}
}

3).IGenSQL

Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ZM.PH.PlugInInterface


{

/**//// <summary>
/// 生成数据库SQL脚本接口。
/// </summary>
public interface IGenSQL

{

/**//// <summary>
/// 根据数据表实体生成SQL。
/// </summary>
/// <param name="table">数据表实体</param>
/// <returns></returns>
string GenSQL_Table(IDBTable table);


/**//// <summary>
/// 生成SQL(空白架构的数据表)。
/// </summary>
/// <returns></returns>
string GenSQL_Table_Empty();


/**//// <summary>
/// 生成SQL(空白架构的存储过程)。
/// </summary>
/// <param name="spType">存储过程类型</param>
/// <param name="procedureFullName">存储过程完整名称</param>
/// <returns></returns>
string GenSQL_Procedure_Empty(SPTypes spType, string procedureFullName);


/**//// <summary>
/// 生成SQL(存储过程_Insert)。
/// </summary>
/// <param name="table">数据表对象</param>
/// <param name="procedure">存储过程对象</param>
/// <returns></returns>
string GenSQL_Procedure_Insert(IDBTable table,IDBProcedure procedure);


/**//// <summary>
/// 生成SQL(存储过程_Update)。
/// </summary>
/// <param name="table">数据表对象</param>
/// <param name="procedure">存储过程对象</param>
/// <returns></returns>
string GenSQL_Procedure_Update(IDBTable table, IDBProcedure procedure);


/**//// <summary>
/// 生成SQL(存储过程_Delete)。
/// </summary>
/// <param name="table">数据表对象</param>
/// <param name="procedure">存储过程对象</param>
/// <returns></returns>
string GenSQL_Procedure_Delete(IDBTable table, IDBProcedure procedure);


/**//// <summary>
/// 生成SQL(存储过程_Select)。
/// </summary>
/// <param name="table">数据表对象</param>
/// <param name="procedure">存储过程对象</param>
/// <returns></returns>
string GenSQL_Procedure_Select(IDBTable table, IDBProcedure procedure);


/**//// <summary>
/// 生成SQL(存储过程_PagingSelect)。
/// </summary>
/// <param name="table">数据表对象</param>
/// <param name="procedure">存储过程对象</param>
/// <returns></returns>
string GenSQL_Procedure_PagingSelect(IDBTable table, IDBProcedure procedure);


/**//// <summary>
/// 生成SQL(调试存储过程)。
/// </summary>
/// <param name="procedure">存储过程对象</param>
/// <returns></returns>
string GenSQL_DebugProcedure(IDBProcedure procedure);


/**//// <summary>
/// 生成SQL(空白架构的视图)。
/// </summary>
/// <returns></returns>
string GenSQL_View_Empty();


/**//// <summary>
/// 生成SQL(调试视图)。
/// </summary>
/// <param name="view">视图对象</param>
/// <returns></returns>
string GenSQL_DebugView(IDBView view);


/**//// <summary>
/// 生成SQL(空白架构的自定义函数)。
/// </summary>
/// <returns></returns>
string GenSQL_Function_Empty();


/**//// <summary>
/// 生成SQL(调试自定义函数)。
/// </summary>
/// <param name="function">自定义函数对象</param>
/// <returns></returns>
string GenSQL_DebugFunction(IDBFunction function);

}
}

4).IGenOthers

Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ZM.PH.PlugInInterface


{

/**//// <summary>
/// 生成其它代码的接口。
/// </summary>
public interface IGenOthers

{

/**//// <summary>
/// 生成代码。
/// </summary>
/// <param name="table">将要生成代码的数据表对象</param>
/// <returns></returns>
List<GenCodeLayer> Gen(IDBTable table);
}
}

同时还规定,所有继承以上接口的对象都必须实现PluginInfoAttribute自定义属性和相关构造参数。
PluginInfoAttribute

Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ZM.PH.PlugInInterface


{

/**//// <summary>
/// 插件相关信息。
/// </summary>
[Serializable]
public class PluginInfoAttribute : Attribute

{

构造器#region 构造器


/**//// <summary>
/// 构造器。
/// </summary>
/// <param name="guid">当前插件唯一的Guid(请注意一定要在外部程序中重新生成一个新的Guid号,否则会影响当前插件或其它插件的使用)</param>
/// <param name="name">软件名称</param>
/// <param name="version">软件版本</param>
/// <param name="copyright">版权声明</param>
/// <param name="author">作者姓名(可包含相关联系信息)</param>
/// <param name="webpage">主页</param>
/// <param name="description">说明</param>
public PluginInfoAttribute(string guid, string name, string version, string copyright, string author, string webpage, string description)

{
this.Guid = new Guid(guid);
this.Name = name;
this.Version = version;
this.Copyright = copyright;
this.Author = author;
this.Webpage = webpage;
this.Description = description;
}

#endregion


属性#region 属性


/**//// <summary>
/// 获取 当前插件唯一的Guid。
/// </summary>
/// <remarks>请注意一定要在外部程序中重新生成一个新的Guid号,否则会影响当前插件或其它插件的使用</remarks>

public Guid Guid
{ get; set; }


/**//// <summary>
/// 获取 软件名称。
/// </summary>

public string Name
{ get; set; }


/**//// <summary>
/// 获取 软件版本。
/// </summary>

public string Version
{ get; set; }


/**//// <summary>
/// 获取 版权声明。
/// </summary>

public string Copyright
{ get; set; }


/**//// <summary>
/// 获取 作者姓名。
/// </summary>

public string Author
{ get; set; }


/**//// <summary>
/// 获取 主页。
/// </summary>

public string Webpage
{ get; set; }


/**//// <summary>
/// 获取 说明。
/// </summary>

public string Description
{ get; set; }
#endregion
}
}

由于项目需求的不同,使用者可根据相关需要选择或创建相应插件,如SQLserver2005 + .net c# petshop或其它数据库 + 其它程序语言 + 其它分层结构代码等,尽可能的利用现有的插件工作,提高开发效率。当然,如果你在某方面有研究,可以开发相关插件与别人分享,既利于自己,又惠泽他人,何乐不为!
可能现在大多数的程序员都有自己的代码生成器,对于大多数人来说,开发这样一款小工具是轻而易举的事,但有没有考虑过系统扩展性呢?也许生成的代码对自己有用,但未必适合别人,貌似每个想快速开发的人都有必要开发一款适用于自己的代码生成器,这似乎有浪费社会成本之嫌!
能不能根据每个人的特长有针对性的开发呢?比如甲对数据库A有研究,可以编写针对数据库A的访问插件;乙对数据库B感觉兴趣,他可以编写针对数据库B的访问插件;丙精通于某种业务结构,他就可以编写生成此结构代码的插件......可以预见,参与的人越多,就会有更多的插件与别人分享,最终达到我们的开发目的:专业、高效。这就是发布这款软件的初衷,如果需要,我会考虑开放所有源代码,但愿我能为您的高效开发作出贡献,谢谢。
以上对本系统中相关接口进行简要介绍,如果您对此感兴趣,可以直接联系本人,本人将开放相关源代码,方便你的开发。
联系:QQ:157561711(本人),群号:41195215,E-Mail:mrhgw#sohu.com。
插件项目源代码下载
发布地址:北京2008奥运献礼 --- 隆重发布.net项目开发工具(V3.0)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述