【原创】探索Newlife X组件利器之:XCoder点滴[附下载]

        本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html

Newlife XCode组件相关文章目录:http://www.cnblogs.com/asxinyu/p/4329747.html

  XCode让我一个外行业余者转变为一个半专业的开发人员,心怀感激,让我把更多的精力关注在业务,而不是数据库,存储过程,sql,以及编写一遍一遍的垃圾代码。在这里我不对Newlife XCode做过多介绍,XCode曾经是一个轻量级ORM组件,现在XCode加上XCoder,变成了一个非常强大的数据建模工具,支持实体对象数据到不同媒体的数据映射,提供面向对象的方式操作数据库,解决90%以上的数据库操作场景。X系列组件同样功能强大,以前写过很多篇关于XCode的文章,再打算写几篇总结,深入一点的,让大家更多更好的了解XCode的强大功能以及开发效率。

1.X组件资源汇总与入门文章

我的博客有一篇文章汇总了X组件(主要是XCode)的相关资源和文章:http://www.cnblogs.com/asxinyu/archive/2013/04/16/3023386.html

另外,我特别推荐JangoJing的几篇入门教程,是XCode学习入门的经典文章:

NewLife.XCode 上手指南(1)-基础介绍入门 

NewLife.XCode 上手指南(2)-反向工程使用

NewLife.XCode 上手指南(3)-扩展属性使用

NewLife.XCode 上手指南(4)-级联操作

NewLife.XCode 上手指南(5)-复杂查询 

2.初识XCoder:基本代码生成功能

XCoder是X组件入门的第一个工具,它的初衷是为XCode提供一个代码生成器,根据自定义的C#语法模版,来批量生成自定义的代码,如模型,业务操作,表单等等。只有学会了XCoder的代码生成才能顺利的使用XCode进行数据库操作。这只是一个工具,使用是非常简单的,但现在XCoder的功能越来越丰富,已经不仅仅是一个代码生成器了,而是一个越来越成熟的数据库建模工具。例如,数据库架构导入导出,新增数据库架构,链接其他类型的数据库,进行数据查询。那今天就逐一了解下这些功能。看看最新版的XCoder界面:

 首先简单的给大家介绍一下,主界面上的东西,和用途,这样大家有一个初步的了解,使用就方便了。其实试一试很快就知道了,这里深入点讲解,可能一部分细节对你以后开发有用的。本文最上面的推荐入门文章,其实也很详细的介绍了用法。

1) 在初始启动,没有“连接”数据库时,菜单只有3个:“文件”,“添加模型”,“帮助”。菜单里面的东西都很直观,大家打开看就知道,都是一些细节,比如"Oracle客户端运行时检查","表名字段名命名规范"等等,最好是按照上面的细节要求来,这样兼容性和处理问题就最好。这里的“添加模型”是我去年12月份左右空闲的时候为XCoder增加的一个建模功能,还很粗糙,对简单的项目,可以直接用。目的是在没有任何数据库软件的情况下,进行数据库设计和开发。思想很简单,通过添加模型,生成XCoder指定的XML模型格式,然后利用模型来生成实体,最后在项目中通过“反向工程”来生成数据库;当然这里也可以通过直接导入XML模型来获取架构(第一次要先连接数据库,生成XML架构,以后才可以导入进行操作);

2) 关键的“连接”:这里的“连接”是指“数据库连接字符串”,它是在配置文件进行指定的,所以这里是下列列表,如果需要改动或者新增“连接”,需要打开配置文件。项目开发的时候,也是的,XCode会在默认的项目配置文件中进行查找字符串,是根据“连接名”来匹配查找的,在“实体”模型里面,会把生成实体的“连接名”记住,默认采用此名称;当然在开发的时候,是可以动态对 实体的 连接进行修改的,这个功能就是 “分库分表”的基础,因此在使用XCode的项目中,可以轻易的进行分库分表操作,而实体都是同一个。看看配置中“连接字符串”的格式,以及支持的数据库:

 1 <connectionStrings>
 2     <add name="mssql" connectionString="Data Source=.;Initial Catalog=master;Integrated Security=True;" providerName="System.Data.SqlClient"/>
 3     <add name="access" connectionString="Provider=Microsoft.Jet.OLEDB.4.0; Data Source=XCMS.mdb"/>
 4     <add name="Oracle" connectionString="Data Source=orc;User ID=admin;Password=admin;DllPath=C:\OracleClient" providerName="System.Data.OracleClient"/>
 5     <add name="Oracle2" connectionString="Data Source=(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.34)(PORT = 1521))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = ORC)));User ID=admin;Password=admin;;DllPath=C:\OracleClient" providerName="System.Data.OracleClient"/>
 6     <add name="sqlite" connectionString="Data Source=test.db;" providerName="Sqlite"/>
 7     <add name="MySql" connectionString="Server=.;Port=3306;Database=master;Uid=root;Pwd=root;" providerName="MySql.Data.MySqlClient"/>
 8     <add name="SqlCe" connectionString="Data Source=test.sdf;" providerName="SqlCe"/>
 9     <add name="Firebird" connectionString="Server=.;Database=test.fdb;User=SYSDBA;Password=masterkey;" providerName="FirebirdSql.Data.FirebirdClient"/>
10     <add name="PostgreSQL" connectionString="Server=.;Database=master;Uid=root;Pwd=root;" providerName="PostgreSQL.Data.PostgreSQLClient"/>
11   </connectionStrings>

应该很简单,目前XCode已经不用任何扩展就支持上述7种数据库,当然通过接口,也可以支持你想要的数据库。注意,XCoder界面中下拉列表的集合就是这里字符串的"Name"属性集合。

3) 在配置文件中配置好“连接字符串”后,通过“连接”按钮,就可以实时的获取数据库架构了(当然配置文件要正确哦),这时在"数据库表"下来列表,可以看到指定的“连接字符串”所对应的数据库的所有表了(如果没有这里选择不能用或者没有表,可能是字符串配置有错误哦)。可以选择单个表进行生成,也可以选择所有表生成;当然之前要选择下面的“模版”,XCoder内置了8种模版,也可以自己编写模版,放在指定的目录就可以读取了,如下图所示的8种模版,一般的项目实体主要用“实体数据”,和“实体业务”2个模版,其他的模版其实也挺有用,只不过适用的地方不是特别广泛:

注意:如果想参考XCoder的模版语法和编写,可以查看内置模版,点击“释放内置模版”,就可以在XCoder的目录看到Template文件夹了,里面包含了所有的内置模版,自定义的模版也是放在这个文件夹里面的。

 4) 选择好模版之后,下一步就是填写生成代码命名空间的相关信息,主要是:

    命名空间:填写你计划中类库项目的命名空间;

    连接名:这里一定要填写你项目中使用的“数据库连接字符串”的“Name”名称属性,可以和当前的XCoder中的名称不一样,当然最好是一样的,免得自己也搞糊涂了。

    实体基类:一般就是Entity了,但有一个可选的“生成泛型实体类”,因为XCode里面大量的使用泛型基类,所以这里的泛型实体类在设计一些基础模型时是很有用的,如果是初次使用,在没有搞懂XCode的一些原理之前,还是不要勾选为好。

    输出目录:这个就是生成的文件的保存位置,相对与当前目录,可以选择中文文件名,中文文件名称是根据表的备注来的;

    扩展属性编辑器:这个功能是在我的提出下,大石头团队增加的功能,这个功能的目的是提供更多的可选参数,来丰富模版的开发。例如目前界面上的命名空间这些设置,如果有人自定义了很多信息,需要更多的设置项目,怎么办?那就可以在这里面动态添加进行,模版生成的时候,会在这里面进行寻找参数值。

5) 其他的也没什么了,主界面也就这点元素,只要连接字符串配置正确,都很好办。右小角是动态获取的论坛文章列表信息。有兴趣的可以多去论坛看看,那里有很多资源,包括问题和答案,还有大家喜欢的源代码。

3.活用XCoder:模型与架构管理

3.1 导出模型

  在主界面上,顺利连接数据库,获取到架构信息后,可以通过“导出模型”按钮,将数据库的架构信息保存到XML文件中。这样做的好处就是,以后每次修改数据库就不需要使用原始的数据库管理软件了,直接使用XCoder提供的架构管理就可以进行代码生成或者架构更新等操作。同样,在上一节中,也提到了也可以直接通过“导入模型”来获取架构信息,就是这个意思,下面看看导出XML的例子,就是保存了数据表的各种原始信息,如下XML代码,是开源的DTCMS的数据库中的一个表的导出信息格式,太多无法一一列出:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <Tables Version="8.9.4841.25349">
 3   <Table Name="dt_amount_log" Description="充值日志" DbType="SqlServer">
 4     <Columns>
 5       <Column Name="id" DataType="Int32" Identity="True" PrimaryKey="True" Description="自增ID" />
 6       <Column Name="user_id" DataType="Int32" Description="用户ID" />
 7       <Column Name="user_name" DataType="String" Length="100" Description="用户名" />
 8       <Column Name="type" DataType="String" Description="类型" />
 9       <Column Name="order_no" DataType="String" Length="100" Description="订单号" />
10       <Column Name="payment_id" DataType="Int32" Default="0" Description="支付方式" />
11       <Column Name="value" DataType="Decimal" RawType="decimal" Length="9" NumOfByte="5" Precision="9" Scale="2" Default="0" Description="增减值" />
12       <Column Name="remark" DataType="String" Length="500" Description="备注说明" />
13       <Column Name="status" DataType="SByte" Length="3" Precision="3" Default="0" Description="状态0" />
14       <Column Name="add_time" DataType="DateTime" Default="getdate()" Description="生成时间" />
15       <Column Name="complete_time" DataType="DateTime" Description="完成时间" />
16     </Columns>
17     <Indexes>
18       <Index Name="PK_DT_AMOUNT_LOG" Unique="True" PrimaryKey="True" Columns="id" />
19     </Indexes>
20   </Table> 
21 </Tables>

天天和数据库打交到的朋友,应该很清楚的很容易理解,每个表的名称,描述,以及原始的数据库类型,列名的信息,长度等等,以及索引的信息,都包括了。这些信息是代码生成器的基础,同时也是XCode操作的基础。

3.2 数据库架构管理

在导入模型或者连接数据库后,菜单会出现“模型”项,有几个子项目,第一个子菜单就是“数据架构管理”,点击进去之后,界面如下:

如上图突出部分显示,可以选择查看“当前数据库连接”下的数据库中的各个“表”的架构信息,同时还可以进行编辑修改,当然也可以直接选择其他“连接字符串”;同时,也可以获取建表的Sql语句等功能;也可以动态添加好字段和索引功能;可以说,可以完全抛弃其他数据库管理工具,直接使用XCoder来完成数据库建模的任务。当然可能某些功能需要完善,当这个小巧的东东如此强大,也许可以大大减轻我们的工作量和关注的事情。而且修改的模型保存为XML后,对所支持的数据库是通用的。

3.3 查询分析器

这是XCoder强大的亮点之一,同样是基于“连接字符串”,当XCoder连接上数据库后,就可以通过使用查询分析器,编写sql语句进行查询。为什么强大?也许你懂了,各种数据库都可以在这里查询,这意味这什么,意味着那些庞大的数据库管理软件貌似都不需要了。曾经我电脑上没有查看access和sqlite的软件,后来想到了XCoder的这个功能,马上拿来用,非常好使。看看截图:

也就是说通过配置文件,所有XCoder支持的数据库都可以在这里通过sql语句进行查询。这对开发带来的影响也许很小,但对个人习惯来说,确实一大步,毕竟再好的电脑,性能也有限,软件越少越好,越精简越好。

4.XCoder模版的介绍

  XCoder核心其实就是XCode和XTemplate,上面介绍的以及实际开发用到的基本都是XCode,而模版引擎XTemplate这个强悍的工具,不得不在这里说一说。我的博客曾经有一篇文章里面详细讲到过模版引擎的语法:

1、模板是完全使用C#作为模版语言,把<##>标签外的文本内容当作字符串原样输出,而把<##>标签内作为C#代码执行,因此很容易理解。
2、模板引擎中获取的数据值,传入的Data是一个字典集合,可以根据名称访问,任何获取变量值都要用 <#=  #>,例如<#= Data["NameSpace"]#>,获取字典中key为NameSpace的值,用来作为命名空间。<#= #>同样可以用来获取在模板中定义的的变量值。
3、模板中变量的定义是在<# #>里面定义的,不要=号,定义的时候可以使用<#=#>来替代部分值。如
< # string title = <#=Data["Title"]#>Name#>,这里组合一个字符串,可以在下面调用<#=Title#>
3.另外模板中需要的循环等都要在<# #>里面,其他所有在<# #>都会原样输出。
4.可以看到整个模板中就是这2个东西<##>和<#= #>,他们是关键,虽然没什么难度,但出错了,的确比较麻烦,很难改,当然模板引擎有调试功能,当然多写多改,就经验就好办了。下面来分析一段简单的模板,就是字段定义的,根据Data是一个键值对集合,来生成字段定义,键值对中Key是字段名称,value是字段类型。Data集合中还有2个其他的字段,不能包括在里面,那就是NameSpace和ClassName,所以生成字段的时候要把这2个排除在外,所以下面的循环中有一个判断。

还是看一个很简单的XCoder内置的模版例子,这个例子是根据数据库表来生成“实体的属性”:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel;
 4 
 5 namespace <#=Config.NameSpace#>
 6 {
 7     /// <summary><#=Table.Description#></summary>
 8     [Serializable]
 9     [DataObject]
10     [Description("<#=(""+Table.Description).Replace("\\", "\\\\")#>")]
11     public partial class <#=Table.Name#>
12     {
13         #region 属性<#
14         foreach(IDataColumn Field in Table.Columns)
15         {#>
16         private <#=Field.DataType.Name#> _<#=Field.Name#>;
17         /// <summary><#=Field.Description#></summary>
18         [DisplayName("<#=Field.DisplayName#>")]
19         [Description("<#=(""+Field.Description).Replace("\\", "\\\\")#>")]
20         [DataObjectField(<#=Field.PrimaryKey.ToString().ToLower()#>, <#=Field.Identity.ToString().ToLower()#>, <#=Field.Nullable.ToString().ToLower()#>, <#=Field.Length#>)]
21         public <#=Field.DataType.Name#> <#=Field.Name#> { get { return _<#=Field.Name#>; } set { _<#=Field.Name#> = value; } }
22     <# }#>
23     #endregion
24     }
25 }

对照上面的语法,和这段模版,好好讲解一下:

1) 开头的命名空间引用都是原样输出,因为它不在任何的<##>之间;写什么就输出什么

2) 这里的<#=Config.NameSpace#>其实就是获取XCoder界面上的设置:命名空间,包括界面上讲到的扩展属性编辑器,其实就是把键值对放在Config.Items里面,这里就是从Config里面获取界面上输入的信息。<#=XXX#>其实就是获取值进行填充了;

3) <#foreach(IDataColumn Field in Table.Columns){#> 这里的<#  #>是循环语句,也就是说对Table表所有的字段进行遍历,循环进行的操作在括号里面;

4) 其实要点就这么几条,其他的语法都是C#语法,所有模版引擎的编写是非常简单的,模版里面的Table类就是数据库表的架构信息,需要注意的就是括号的匹配,如果不小心括号搞错了,调试还是有些麻烦的。

5.资源下载

顺便发一个最新版本的XCoder,有兴趣的就研究下哦,用它打造一个自己的代码生成器太简单了。

 XCoder V5.1http://www.kuaipan.cn/file/id_4279479643944128.htm

posted @ 2013-09-18 07:59  数据之巅  阅读(4277)  评论(17编辑  收藏  举报