.net框架学习 自动化就是让人越来越懒
这几天在学习框架,主要是基于NHibernate框架,以来为核心来做扩展学习,遇到什么问题找相应的解释。写下自己的心得,本人比较懒,这是第一篇日志,呵呵。
本文所涉及的框架都是基于面向对象开发模型的。企业信息化在中国还是有很大潜力,从横向讲面对不同行业、规模以及人的因素(包括领导,员工),另一方面从企业的架构、战略、内部组成、生产要素等来考虑,不同企业对信息化的要求,实现目标大相径庭,面对纷繁的企业内部需求以及外部需求,怎样寻找一种满足特定企业群需求又满足软件工程思想,我们说不要为做软件而做软件,在分析软件需求与实现的道路上,需求的不断变化使我们不得不摆脱了以往那种需要什么实现什么的想法,随着软件复用思想的根生地固,怎样在变化需求和复杂逻辑中寻求软件的重用(提高生产率),成为我们关注的焦点,所以才有那么多针对不同应用领域的解决方案出来。要实现复用,就必须把不变的东西抽象化,把变化的东西分离出来,通过在变化与不变化间实现接口或抽象类来实现。(扯了那么多,我觉得以后的软件还会继续抽象,可能是更多层次)。那么怎样实现一种更高层次的抽象,(其实大自然是最好的老师,从人类诞生我们就是对自然的学习中一步一步进化到现在地步)。面对现在的三种企业业务逻辑组织模型,面向过程事务脚本方式只适用于那些需求不改变,或者只做一个版本以后就不变的东西,这样的东西应该不多了吧,呵呵。面向数据集的开发模式是现在应用的最多的,通过rad(快速应用开发)和数据感知组件在.net和其他应用开发环境的大量应用(很遗憾我们只能被老外牵着鼻子走),当然也有这样做所带来的好处,但是在处理复杂问题时带来的代码难以理解以及经常会遇到的冗余代码(经常复制粘帖),而且在这个模式下产生的不同系统架构往往是不清晰或者让人不知道为什么要这么做,究其原因我想主要是因为数据层和数据表现层的紧耦合(排除人为因素),设计模式一直在针对不同问题进行孜孜不断的解耦合,就像做研究的不想用windows一样,追求不同境界不同。这个我想是历史的必然哈,也有它的生长环境。另一种面向对象的领域模型设计按照我的理解,如下图:
扯蛋了这么久,说说这几天学习的框架。基于NHibernate,扩展到对其他框架的学习,学得不深,可能有些地方不对,还请指教。涉及所用技术aop(面向方面编程(动态代理)),IOC(注射依赖或者叫反转控制,都不好听),IOC容器(Castle,sping.net),数据库缓存。
下面以问题的形式做总结。
1. 什么是NHibernate
从JAVA移植来的开源项目,java里有Hibernate,通过xml文件到数据库的映射来固化关系数据库底层,从而摆脱对数据库底层的直接操作,按照我的理解通过映射摆脱偶合就像通过一书结婚证书证明我们结婚以后都不用怕警察来茶房。。哈哈。
NHibernate是个非常强大的工具,懒人喜欢的,它可以通过自动生成表和持久层映射文件或者通过codesmith来动态生成持久化操作类和持久层映射文件,不过要自己先建立数据库,codesmith生成的代码太多了,自己要做删除,在有一对多,多对一等复杂关系时要注意自己数据库表的建立,另外不知道能不能生成继承关系等,没时间搞那个。
2. 利用NHibernate动态生成数据库表
引用库NHibernate.Tool.hbm2ddl,new SchemaExport(cfg).Create(true, true);第2个参数得为true。利用持久层映射文件反射获得创建表的信息,然后用SQL脚本实现,如果原来该表存在,则删除该表中数据和表并重新生成该表。
3. 利用NHibernate动态生成持久层映射文件
引用库NHibernate.Mapping.Attributes; 利用反射获得相应对象上的标签,然后通过标签序列化相应的映射文件,其中通过标签可设置数据库表的关系,得到这个映射文件也是能动态生成数据库表的前提。
4. 利用codesmith生成持久化操作类和持久层映射文件
选择codesmith explore->c#->NHibernate.cst,输入连接字,选择数据库即可输出。缺点前面以说。Codesmith也是功能强大,可惜没时间看。
HQL:面向对象查询语言。
5. NHibernate缺点
多表查询,复杂逻辑还是得用SQL,我没找到好办法。。。优点网上很多,也没其他体会,不说了。
6.NHibernate与Ibatisnet比较
都是从java移植过来的,Ibatis.net是轻量级的,NHibernate当然是重量级,哈哈。Ibatisnet半自动产品,貌似功能还有缺陷,不过它封装了数据访问层(事务,缓存,异常,日志),做了部分的对象关系映射,也就是我们要自己写SQL语句。不过在数据库设计不怎么好或者业务逻辑复杂的时候自己写比自动生成效率要高,毕竟还没那么自动化。同时因为它的小巧半自动也为在开发过程中或者在已有产品的改造中更容易被接受。另外NHibernate自动生成的SQL语句可能会有多余比之自己写查询语句。
7. 其他的几个框架
IOC容器:Castle与sping.net
Castle是.net自己发展来的,sping.net也是从java移植过来的。Castle针对性更强,
框架之间也是相互吸收好的地方,不断改善的。某些大软件公司也是一样,无可厚非,呵呵。
8. 架构选择
NHibernate的核心库NHibernate中的ISession缓存数据库对象,加快了查询速度。IbatisNet Castle的Castle.DynamicProxy也是NHibernate用到的库,用来反转控制,就是在某个对象某个事件发生的时候就在那一刹那前后我插入其他活,有点像钩子,不知道理解对不对,呵呵。
9.测试工具
VS2005自带的单元测试工具需要安装Team Edition for Testers,功能强大,除了单元测试还有其他测试功能,而且还会生成测试报告。只要把鼠标移到要进行测试的类的函数上点右键选择进行测试即可。Nunit是单元测试工具,引用库NUnit.Framework。进行测试的程序为类库,进行测试的类必须申明为Public,且加标签[TestFixture],进行测试的函数也必须加Public,切加标签[Test],并在外部启动程序中加入nunit.exe的安装后的绝对路径。然后启动,将类库程序dll加入nunit程序中点运行即可,两个测试工具都可加断点调试。
没用过JAVA的人的理解,原来JAVA还是蛮好的,哈哈。