Kanas.net 快速入门

广州的九月已经入秋,天气已经不再象前段时间那样酷热。在这个季节去看看喀纳斯的美丽景色是一年中最佳的选择。如果你没有去美丽喀纳斯的时间和经费上的预算,那就请随我进入Kanas.net之旅,虽然不如去喀纳斯那么浪漫,但也是一个退而求其次的选择。

Kanas.net Framework是一个非常易于使用的持久层框架,如果你有非常好的面向对象的基础,使用这个框架来实现对数据的透明访问,应该会让你感到满意。如果你质疑我的这个结论,那么你先随我启动这个很小的示例,我相信你会和我有相同的结论。

第一步下载Kanas.net Framework的最新版,并且安装到系统中。

Kanas.net Framework是一个很小的框架,安装到系统中的内容包括核心源代码和全部的文档也不会超过6M。建议在安装的时候关闭Microsoft Visual Studio.net 2003,因为需要在这个IDE中安装一个小的插件以帮助你自动地将你的ERM文档自动转换为实体类型的源代码。

这里需要做一个小的说明。你从博客园下载的安装包中仅包括核心源代码及部分测试代码、MSDN风格的帮助文档、VS.NET插件三个部分。对于希望了解Kanas.Net框架的用户来说已经足够了。更完整的安装包包括一个可视化工具(可以从各种数据库模型、Visio数据库设计模型和PowerDesigner数据库设计模型中直接导入到Kanas.Net的实体关系模型中)、一组PowerPoint/Word教程和一系列扩展包,由于涉及版权License问题目前尚不开放,仅在本公司范围内发布。

第二步:如果你的系统中安装有VS.Net,可以直接打开安装后的快捷方式Kanas.Net.SDK解决方案,然后你就可以看到解决方案中所包括的五个项目:

  • Kanas.Utils:实用程序项目。关于这个项目的详情我曾经写过一篇文章来介绍。
  • Kanas.Common:基础架构项目。这个项目与我公司内部发行的版本略有差异。后者加入了三个重要的基础架构:基于XMLDOM架构、基于XML的配置架构和数据集的自由导出架构。
  • Kanas.Framework:持久层项目。包含所有的持久化服务。
  • Kanas.Contacts:联系人项目。这个项目选自Microsoft OfficeAccess示例数据库Contact。虽然该数据库非常简单,所包含的关系非常少,但作为一个入门的选题可以避免很多复杂的问题。在这个项目中可以看到所有基于Kanas.net Framework的项目如何构造一个配置环境、如何通过实体关系模型来产生相关的业务代码并令你在业务模块中轻松地解决复杂的业务问题。
  • Kanas.Test:测试项目。这个项目是一个单元测试项目,如果你的系统中安装有TestDriven.net,你甚至可以在NUnitGUI中直接Run起来,相信你能够看到全部的绿灯。

第三步:现在先不要急于研究前面的三个项目,将注意力放到Kanas.Contacts项目上。这是整个解决方案中最重要的项目。该项目演示了Kanas.Net的几个非常有用的配置或扩展功能:

  • 通过实体关系模型生成实体代码
  • 通过配置来初始化业务环境
  • 自定义数据库提供器
  • 自定义约束子
  • 自定义约束子的数据库实现

首先让我们先看看ER模型。在Kanas.Contacts项目中有一个Contact.erm文件,其生成操作是“无”,但定义了自定义工具“KanasCodeGen”。请以“HTML/XML编辑器”方式打开这个文档,你立即可以看到整个实体关系模型,除了数据库模型中的表格及字段外,还包括一些额外的内容,如领域概念模型。

ER模型的根元素是“ERModel”,其中规定了一些主要的属性:

  • description:模型的描述。
  • namespace:生成代码的命名空间。
  • codelang:生成代码所用的语言。CSharp就是C#VB就是VB.Net
  • workingpath:工作路径,即生成代码文件的路径。该属性不控制代码生成插件。VS.NET插件总是将代码生成到erm文档所在的目录下。
  • layout:生成代码布局,可选的项是Single(生成单个代码文件)Chunk(每个类型单独生成一个代码文件)Build(不生成代码文件,直接编译为程序集)。该属性不控制代码生成插件。VS.Net插件总是将代码生成为单个文件。

Contact项目不包括枚举。所以在enums下未包含任何元素。在我的另外一个项目PMC中,由于“缺陷管理”中的选项极多,居然多达十多项。

entities节中包括所有的实体。每个实体元素以entityid属性开始的一系列属性,name(类型名称)description(类型说明)aggregated(是否需要构建集合类型)mapping(映射到数据库中的表名)等。每个entity节中包含若干个property元素,每个property元素则包括name(属性名称)type(属性类型)description(属性描述)mapping(映射到数据库中的字段名称)等属性。

点击“解决方案资源管理器”的工具栏中的“显示所有文件”按钮,可以看到contact.erm文档下有一个contact.cs文档。打开这个文档可以看到所有实体的代码。

现在我们试试修改一下erm文档,看看生成的源码能否自动同步。

1.打开Contact.cs单元,找到Contact class,可以看到一个Calls属性,说明为“获取对电话的聚合”:

        /// <summary>
        
/// 获取对电话的聚合
        
/// </summary>

        [MappedCollection(typeof(CallCollection), typeof(Call), 1)]
        
public CallCollection Calls
        
{
            
get
            
{
                
return ((CallCollection)(this.EnsuredCell.GetCollection("Calls")));
            }

        }

这个属性是一个典型的一对多的聚合关系,通过该属性收集该联系人的所有电话记录。这个属性生成的原因是在Contact.erm文档中Call实体的Contact属性后面的Aggregated Attribute。试着删除这个属性,并保存erm文档。再回到contact.cs页,你会发现Contact.Calls属性没有了。我们再一次修改erm文档,在Call实体的Contact属性元素后面添加一个属性:

Aggregated=”Calls”

并保存erm文档。再回到contact.cs页,你会发现Contact.Calls属性又回来了。

erm文档是整个业务系统中的关键文档。利用这个文档可以实现部署上的一系列功能,例如重建数据库。

接下来我们看看如何初始化业务环境。根据Kanas.net教程,使用Kanas.net提供的Adapters全局对象或AppContext来初始化业务环境:

  • 通过注册数据适配器或数据提供器来建立数据库引擎;
  • 通过绑定业务类型到指定的数据适配器中来获得每个业务类型的访问方式。
  • 通过安装业务捕获器来干扰数据加载及持久化。
  • 通过安装可安装应用上下文部件来注册绑定到应用上下文的工作部件。

但是在Kanas.Contacts项目中没有使用上述的方式,而是采用配置来实现。

Kanas.Contacts项目中最主要的单元就是Services.cs。这个单元中的Services类是整个业务模块的“引导类”,所有业务环境的初始化及持久化服务都可以通过该类型来实现。该类型的构造器是私有的,所以该类必须通过静态工厂方法来获得实例。该类型有一个静态方法和一个静态属性,前者通过指定配置文件所在的路径来初始化,后者通过静态属性获得单件(Singleton)实例。

分析Services类的构造器,可以发现,Services通过Kanas.Utils.ConfigLoader来通过配置文件初始化业务环境。打开配置文件Kanas.Contacts.Config,可以看出来用户能够自由地控制整个初始化过程。

需要说明一点:在配置文件中的adapter节,有一行配置logger的过程。平常在项目中一般可以采用类似

logger=”logfile:./logs/contacts.log”

这样的配置来将数据库日志写入指定的文件中。但在本项目中通过自定义的日志记录器来实现,其目的一是可以在NUnitGUI中立即看到数据库访问过程,二是可以演示如何自定义日志记录器或者说如何与其他日志框架连接。

虽然Kanas.Net Framework提供了OleDbProvider供访问Access数据库,但是Kanas.Contacts项目却采用了自定义的MdbProvider数据库提供器。其目的有两个:一是将原来OleDbProvider的构造器中的ADO.NET连接串参数改为Mdb文件名参数;二是演示如何自定义基于ADO.NET的数据库提供器。

Kanas.Contacts项目还自定义了一个约束子,这个约束子的功能是描述实体指定的日期属性的月日与给定的日期的月日相同。这个约束子的想法是基于一个非常合理的需要:查找生日在某个日期的所有联系人。按照Kanas.net的缺省方式,无法在数据库层面解决这个问题,只能放弃这个约束取出全部的数据,而在实例化环节读出对应属性与给定的日期进行比较以确定是否需要加载这个实例。因为任何一个约束子都必须实现GetDataSelected方法。显然这种方式会损失很大的性能,因为Access访问引擎提供了通过Month(BirthDate)和Day(BirthDate)来获取月日。于是,我从PropertiedConstraint派生了一个DayConstraint,并且实现了DayConstraintCriteriaBuilder,在数据提供器的Init方法中加入这个CriteriaBuilder,最终让这个约束子通过数据库查询来实现而不是通过运行时的匹配。

第四步:运行单元测试。

Kanas.Test项目中,有一个TestBase作为所有测试类的基类。建立这个基类的好处是共享统一的初始化过程。从这个TestBase类派生了四个测试类:

Basic:基本测试。该测试包含了三个测试用例:

  • 插入联系人
  • 删除联系人
  • 修改联系人属性。

LoadingTest:加载测试。该测试包含七个测试用例:

  • 基本加载
  • 加载已婚的联系人
  • 按字符串约束子来加载
  • 按嵌套的约束子来加载
  • 按反引用的日期类型约束子加载
  • 懒惰加载
  • 按生日加载

AggreatedTest:聚合测试。该测试包含一个测试用例:

  • 按联系人类型将联系人分类统计人数的测试

DataTableBuildTest:数据表生成测试。

  • 基本视图测试
  • 带快速查询的视图测试
  • 带嵌套类型快速查询的视图测试

 OKCome onGood lucky

posted on 2006-09-07 14:27 双鱼座 阅读(3165) 评论(27)  编辑 收藏

评论

#1楼  2006-09-07 15:00 浪子      

终于发布了。。
down先
3x 。   回复  引用  查看    

#2楼  2006-09-07 15:57 aspnetx      

just for .net1.1?   回复  引用  查看    

#3楼  2006-09-07 16:09 Teddy's Knowledge Base      

强烈支持,终于又有介绍文章了~~

这一版包含了最新的Domain.User.Address.PostCode == "200000"这样的强类型关联查询了吗?~~

试了一下,保存erm文加时,代码没有在后台自动生成,如果显式的右键点erm文件点击运行自定义工具则报“找不到自定义工具KanasCodeGen”,不知是什么原因,安装程序没有自动注册KanasCodeGen组件吗?   回复  引用  查看    

#4楼 [楼主] 2006-09-07 16:16 双鱼座      

@浪子
:D应该说终于公开发布了。这个框架从2003年底到现在已经快三年了,已经应用于多个项目。在此之前仅在一个朋友圈中发布。
@aspnetx
是的,目前的版本是基于.net 1.1,基于.net 2.0的版本从今年五月已开始设计和构建。但由于该项目是由公司驱动的,目前公司还没有马上更换平台的打算,所以资源方面不是太充足。新的版本由于改动比较大,在性能方面也会有比较大的提升(最大的变动就是直接利用CLI中的DataStorage以取代现在的数据囊),还准备构建基于vs2005的GUI插件,所以估计年内很难发布。
  回复  引用  查看    

#5楼 [楼主] 2006-09-07 16:21 双鱼座      

@Teddy's Knowledge Base
我在公司的多台机器上测试了安装包,都会自动注册代码生成插件,不知道你那里怎么回事?
要不然你手工注册一下然后改一下注册表试试:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\7.1\Generators\{FAE04EC1-301F-11d3-BF4B-00C04F79EFBC}\KanasCodeGen]
"CLSID"="{9DE09040-AA8D-4333-BBE5-959EE7369F19}"
"GeneratesDesignTimeSource"=dword:00000001
  回复  引用  查看    

#6楼  2006-09-07 16:44 henry      

下载了:)
刚开始最惊讶的是只有erm文件就能自动反映到代码中,后来看了一个相关cs没有包含在项目中。
看来实体加载出来并没有和容器断开联系,容器有感知实体改变的过程。
按道理容器内容应该存在缓存管理。
希望双鱼老兄有时间写些关于实体缓存和锁的文章,让小弟们受益一下:)   回复  引用  查看    

#7楼  2006-09-07 16:59 idior      

支持一下。   回复  引用  查看    

#8楼  2006-09-07 17:01 达达      

加油加油~~!希望帮助文档可以详细写!   回复  引用  查看    

#9楼 [楼主] 2006-09-07 18:08 双鱼座      

@henry
呵呵,那个cs是被包含在项目中的,只是DependentUpon于erm文件。这个是VS.Net的特征。看看这个网页:http://msdn.microsoft.com/msdnmag/issues/02/10/NETTopTen/default.aspx
是的,你所说的容器就是我这里的应用上下文,通过对象空间来管理所有的实例。至于侦测实例的改动,这是由DataCell实现的。在加载完成后,加上一个标记,任何改动都会令应用上下文立即复制一个版本到后台。如果提交事务,则立即删除这个版本。如果退回事务或事务提交失败,立即用这个版本来替换前台的“影子”版本。其实使用缓存是“被迫”的,如果不用缓存就只能用LazyLoad,而全面使用LazyLoad性能根本不能忍受。
当然,接下来的时间我会陆续写一些高级用法的版本。例如如何实现一个简单的接口来订阅数据变化;如何跨应用上下文共享和自动同步缓存数据;等等。
@idior
希望得到你更好的支持,那就是不吝赐教。
@达达
这个帮助文档或许不能令你满意,下次改进吧。   回复  引用  查看    

#10楼  2006-09-07 20:17 装配脑袋      

先顶一下,研究中   回复  引用  查看    

#11楼  2006-09-08 09:19 henry      

@双鱼座
看来DataCell在对象甚至于对象成员改变的侦测起着重要作用,如果实体模型里没有掺杂这些东西的情况,上下文对实体的侦测就变得很困难。
我一直认为实体模型越纯越好,最好是不掺杂任何东西。随着组件使用才发现自己的想法有点问题,当不改变模型对外规则的情况下,内部掺杂点东西来加强监控并不是什么坏事;何况这些东西可以由工具去完成。

还有就是国内的开发人员偏向于老外的东西,对国内开发的东西关注还是比较少;我觉得老兄应该把Kanas发布到sourceforge.net上!   回复  引用  查看    

#12楼  2006-09-08 10:06 san      

学习中,框架很好,但是我是刚搞开发的,望文档帮助能够写得再详细点。   回复  引用  查看    

#13楼  2006-09-08 21:39 Nicol      

学习!   回复  引用  查看    

#14楼 [楼主] 2006-09-08 22:15 双鱼座      

晕...果然传错了。请各位重新下载,否则安装程序不自动注册vstool,5555....   回复  引用  查看    

#15楼 [楼主] 2006-09-08 22:18 双鱼座      

@henry
未计划发布到sourceforge.net上,毕竟E文太蹩脚...
我还是希望整一个专门的网站然后招募几名志愿者来维护。   回复  引用  查看    

#16楼  2006-09-08 22:50 闲云      

不错,谢谢您的努力!希望能看到更多关于Kanas.net方面的文章。框架上一方面,文章等不可少!真心祝愿双鱼座老兄的Kanas.net能和国外的一比高下!
  回复  引用  查看    

#17楼  2006-09-13 09:05 学习.NET      

感谢老大的框架   回复  引用  查看    

#18楼  2006-09-13 13:47 ColdDog      

看不懂啊,怎么办?   回复  引用  查看    

#19楼  2007-06-04 02:39 木野狐      

现在才下载。好好学一下。   回复  引用  查看    

#20楼  2007-08-26 17:20 碧落      

下来看看,谢谢老大   回复  引用  查看    

#21楼  2007-11-05 12:57 蛙蛙池塘      

你好,你这个东西有.net 2.0版本吗?   回复  引用  查看    

#22楼 [楼主] 2007-11-05 14:43 双鱼座      

@蛙蛙池塘
当然有,不过现在还不到正式发布的时候。如果你需要,请提供一个email地址,我把其中已完成部分的下载地址发给你。
Kanas.net Framework 2.0包含以下内容:
Kanas.net Data:持久层框架
Kanas.net Security:认证与授权框架
Kanas.net ObjectScape:数据集化框架
Kanas.net Web:Web支持框架
Kanas.net Addin:VS2005插件集合
目前还待开发:
VS2005 DSL支持
DLinq 提供器
待全部完成以后,我会专门写文章介绍,并提供源码下载。   回复  引用  查看    

#23楼  2007-11-05 20:20 蛙蛙池塘      

@双鱼座
太感谢了,期待ing,看你和teddy发的帖子,俺都望尘莫及呀。想下载你们的源码好好琢磨琢磨   回复  引用  查看    

#24楼  2007-11-06 09:36 xjb      

期待你的net2.0版本   回复  引用  查看    

#25楼  2007-12-20 22:07 lexus      

相见恨晚哈,我也想看一下2.0下的版本   回复  引用  查看    

#26楼  2008-01-21 09:04 xjb      

感觉1.0 很不错,我的一个项目部分参考了你的代码,非常感谢。
可以参考一下2.0版的程序,我的email:xjbnet@tom.com   回复  引用  查看    

#27楼  2008-04-17 17:55 Sephil      

很感兴趣,不知道能否跟一份
我用 VS2005
3x

sephil@163.com   回复  引用  查看    

导航

<2006年9月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

统计

与我联系

搜索

 

常用链接

留言簿(30)

我参与的团队

我的标签

随笔档案

文章分类

相册

芸芸众生

最新评论

阅读排行榜

评论排行榜