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