zoukankan      html  css  js  c++  java
  • Database2Sharp之混合型Winform框架代码生成

    Database2Sharp之混合型Winform框架代码生成

    本人一直致力于Winform开发框架的研究和使用,有时候项目要求是传统Winform的,直接访问数据库进行获取数据;有的时候项目要求WCF框架,以分布式访问WCF服务获取数据的,虽然在Winform和WCF框架,都有特定的应用场景和开发思路,但是希望把这两种传统式的框架,加以抽象和提炼,形成目前所介绍的混合型框架,这样所有完成混合型框架改造的通用模块(或一个小业务模块),都能无缝式的实现集成使用。这种混合型框架的特点和优点都非常明显,为我最终实现,一个框架,多个应用的开发平台集成方案迈出坚实的一步。

    1、混合型框架的应用前景

    当然,本篇文章不是对理论的抽象说明,这一向不是我的风格,前面我已经在随笔《Winform开发框架之框架演化》、《Winform开发框架之混合型框架的实现》、《Winform开发框架之混合型框架的剖析》都对Winform框架的变种,混合型框架进行了比较详细的介绍,我希望通过实实在在的项目展示,介绍这种框架的优点特点,以及相关的设计理念。这种框架虽然比较通用,但相对于传统Winform框架和传统WCF开发框架,都增加了不少项目模块,也同时增加了一定的复杂度,如果纯手工来建立这种项目,会有比较麻烦的痛苦经历。

    因此,本篇文件就是介绍了如何使用代码生成工具Database2Sharp来生成一个混合型框架的项目,由于我的Database2Sharp能够获取所有数据库的元数据,因此能够较好实现各种项目架构的生成操作,这种结合代码工具生成项目的方式,也是我们提高效率,统一代码风格,减少代码出错,提高代码健壮性,分享框架经验的最佳方式。

    混合型框架可以看成是Winform框架高级版本,可以很好用来实现一个框架,多个应用的开发平台,我们可以在主体业务框架上,根据需要扩展很多应用,如通用模块有通用权限、通用字典、通用附件管理、通用人员管理。。。。,如果基于业务集成,那么可以把很多小业务也通过这种方式开发,然后通过即插即用的方式实现业务定制化的使用,这些应用都实现了这种混合型的框架,因此集成使用会非常方便。

    2、代码生成工具生成混合型框架

    混合型框架一般包括业务逻辑模块(包括BLL、IDAL、DAL、Entity层),服务接口调用模块(用来整合Winform和WCF接口调用),WCF服务逻辑模块、WCF服务发布模块,Winform界面模块共5个项目的分层,如下所示。

    虽然是需要生成有5个项目的代码,而且每个项目之间还有一些特殊的引用以及各种命名规则,但是这些对于代码生成工具来说,都是很容易做到的事情。

    代码生成工具,是结合数据库信息进行代码生成的过程,因此需要先获取对应数据库信息。

    第一步,在Database2Sharp左边的树形数据库列表中,单击展开对应数据库的详细表,由于Database2Sharp是一次性加载方式,加载数据库表的信息同时,也会加载相关的视图、存储过程(Oracle、SqlServer)、以及表字段和表之间的关系等等信息。单击其中一个表,我们可以看到对应该表的字段信息,以及创建表的SQL语句,也就是我们常说的DDL脚本。 

     第二步,在数据库节点上,单击鼠标右键,选择【代码生成】- 【EnterpriseLibrary代码生成】菜单,开始生成代码如下所示。

    第三步,选择相应的数据库以及数据库表,用于代码的生成。

    第四步,设置相关的代码生成配置信息,包括项目主命名空间,输出目录,以及过滤表名前缀等。

    第五步,确认代码生成操作,一般确认,就会对选定的表进行项目代码的生成操作,生成一体化的整体性解决方案。

    如果项目是要生成基于WCF开发框架的,那么勾选“同时生成WCF服务项目”选项即可,勾选后,可以修改WCF服务的项目名称,方便创建不同的WCF业务项目。WCF项目是基于VS2010开发环境、.NET4.0框架的项目。

    如果项目是生成基于混合型开发框架的,那么勾选“生成混合式框架项目”选项即可,勾选后,“同时生成WCF服务项目”也会默认勾选,因为混合型框架式基于Winform和WCF两种的混合体项目。WCF项目是基于VS2010开发环境、.NET4.0框架的项目,这是目前最优的配置信息了。

    如果勾选生成后打开解决方案,那么代码生成完成后,就会自动打开项目工程,你可以尝试编译,一般情况下,可以完全编译通过的。

    项目生成后,就生成了几个典型的项目分层结构,如图所示。

    贴上几个详细的项目文件结构图,以便更好了解整体的项目结构。

     

    代码生成工具的下载地址:http://www.iqidi.com/Database2Sharp.htm

    详细的代码生成工具Database2Sharp的介绍文档:Database2Sharp代码生成工具-使用帮助.pdf

    主要研究技术:代码生成工具、Visio二次开发、送水管理软件等共享软件开发
    专注于Winform开发框架、WCF开发框架的研究及应用。
      转载请注明出处:
    撰写人:伍华聪  http://www.iqidi.com 
        
     
     

    需求:

     
    在之前的CYQ.Data版本中,如果你要更新某一个字段的值+1;
     
    解决方案:
     
    1:如果用MAction操作,可能会如下代码:
     
    复制代码
    using(MAction action=new MAction(表名))
    {
    if(action.Fill(id))
    {
        action.Set(字段名,action.Get<int>(字段名)+1);
        action.Update();
    }
    }
    复制代码
     
    简单的说,就是需要查询出值,然后再用原值进行相关的操作,用这种代码代价就是要多查一次。
     
     

    2:另一种方式高性能的是使用MProc来直接操作Sql语句,可能会如下代码:

     
    using(MProc proc=new Proc("Update 表名 set 字段名=字段名+1"))
    {
    proc.ExeNonQuery();
    }
     
    用MProc基本是万能的了,直接处理SQL语句和存储过程。。。
     
    大伙习惯了MAction多,所以希望MAction也有个顺路功能:
     
    不过好多人习惯用MAction,都图个方便,连条SQL语句也想省一下。。。

    事实上,我本人在多个项目中,也有这种需求,当然最后都是直接使用MProc处理了。
     
    很多时候,我一直在寻找一种最优方式,能处理这种值+1,值-1的问题,不过每每看着架构,不好下手,一直没找到切入点和使用方法。
     
     

    比如一开始想的:

     
    using(MAction action=new MAction(表名))
    {
    action.Set(字段名,“[字段名]+1”);
    action.Update("id=1");
    }
     
    但是这种方式,实现起来,没想象的简单,而且这值是字符串还是表达式?分不清也说不明,所以一直卡在以何种使用方式上。
     
     

    CYQ.Data 框架设计原则:

     
    CYQ.Data 框架的设计,很多时候,是先思考使用的方法,再去想怎么实现的,先想象出最简单的使用方式,再去想能不能实现,而不是实现了一个功能,却很难使用。

    为此,但网友又对我提出这种需求的要求时,我又花了N个小时,看着代码发呆,每次我思考问题或有某项功能时,我都会看着代码发呆几个小时。。当然是在不停的思考。。
     
     

    后来终于设计出最终解决方案:

     
    复制代码
    using(MAction action=new MAction(表名))
    {
    action.Set(字段名,值);
    action.SetExpression(“字段名=字段名+1”);
    action.SetExpression(“字段名=len(字段名)+1”);
    action.Update();
    }
    复制代码
     
     

    通过增加一个表达式方法,基本上有点万能了,事实在后端,组成的Update语句大体为:

     
    update 表名 set 表达式,字段名=@字段名 where ...
     
     

    简单说,就是表达式只是简单的被附加到原来的set的后面,最终被组装成SQL执行,当然了,如果你想高级点用参数化也是可以的。

     
                using (MAction action = new MAction("Blog_Class"))
                {
                    action.SetExpression("count=count+@Value");//表达式升级带参数化。
                    action.SetPara("Value", 2, DbType.Int32);//设置参数化值
                    action.Update();
                }
     
     

    到此,基本上有表达存在,可以处理N种不同的需求了,方便性提升了不少。

    补充: 

    不小心把文章“只允许注册用户访问”给打上勾了,结果发现注册用户的阅读数仅88,根据统计,还有近27个是为了看文章被逼登陆了一下。

    周末的行情访问量这么低?大伙都跑哪去偷情了?

     
    版权声明:本文原创发表于 博客园,作者为 路过秋天 本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。
     
  • 相关阅读:
    scp命令(基于ssh上传文件等)
    mac上安装ruby
    Access denied for user ''@'localhost' to database 'mysql'
    3.ruby语法基础,全部变量,实例变量,类变量,局部变量的使用和注意的要点
    2.ruby基本语法,类的定义
    1.ruby基本格式
    neo4j在linux下的安装
    mongodb导入json文件
    mongodb 安装启动
    Junit4
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3061947.html
Copyright © 2011-2022 走看看