zoukankan      html  css  js  c++  java
  • ORM+Framework 完整开发ERP/MIS表单流程 比较下速度到底有多快 分享WinForms开发经验

    今天要演示的,是开发ERP/MIS中的员工主档(Employee Master)的功能,添加员工信息的CRUD功能,说白了就是添加,修改,删除这么个功能。这是个通用化的方案,稍微改一下表和实体的名字,就可以是添加采购单,添加销售单的功能,MIS开发简单,容易模仿,开发其他模块时可参照这个功能的流程和步骤。

    1 数据库中添加数据表

    GBEMPL 员工信息

    image 
    GBEMDM 员工文档
    image

    其中GBEMPL 是主表,GBEMDM 是从表,一个员工,有多份文件记录,文件记录可理解为工作经验。
    有两点值得注意
    1)数据库字段名全部用大写,单词之间用下划线分开。这样,在生成.NET的实体名的属性时,会去掉下划线。举例说明,字段MID_NAME,生成的.NET实体的属性名是MidName,以表示两个单词。
    2)为每个数据库实体定义主键,以方便ORM框架做实体映射。

    2 启动ORM 设计器,生成实体及其关系

    打开LLBL Gen,添加数据库引用,指向刚才的数据库,生成自动映射的实体对象文件

    image

    由数据库生成实体类,其实也可以先设计实体,再由实体生成数据库文件。

    LLBL Gen支持Database First 和Model First两者模式。在Project菜单的子项中,有两个菜单Generate Database Schema Create Script和Generate Dataase Schema Update Script,可以生成数据库的SQL,把生成的SQL拿到SQL Management Studio中运行

    image
    推荐用Database First,这样可以控制数据库字段的命名,以及简单的步骤设定数据表主从关系。
    如果忘记在数据库中添加GBEMPL与GBEMDM的一对多关系,请添加适当的关系

    image 
    LLGL Gen可以检测到数据库中的主从表关系,并在刷新数据库时自动添加关系。

    推荐在用ORM Designer生成实体文件之前,先在数据库中设计好主从表之间的关系,这样总有利用于后面的工作。

    3 界面制作,绑定数据

    在VS2008中新增加一个Form,修改它的基类为EntryForm,添加功能编码SAISEM

    image

    EntryForm是UI框架中的基础类型,它承担着数据绑定的重要作用,一般需要做数据录入的功能,都可从此类型派生。

    按照窗体的功能不同,Framework中提供了以下几种类型的窗体
    1) EntryForm 实体输入窗体,呈现用户数据输入, 效果看起来是这样的,有很明显的toolstrip来浏览和修改数据
    image

    2) ReportForm 报表呈现窗体,当会根据报表设计工具自动生成控件选项,以传递给报表并呈现报表。
    image
    3) QueryForm 用户自定义查询窗体,用于展现用户自定义查询,用于呈现查询设计器所设计的查询

    image

    4) FormBase,一些常用的功能设定,可从此类型派生,比如期末结帐,重新核算客户往来帐。

    在员工主档的窗体设计中,最主要的操作是绑定数据,需要完成以下几个重要的步骤

    1) 给窗体提供数据源,LLBL Gen会取当成生成的代码的Factory

    image
    2) 给需要的控件绑定数据源的值,控件类型对应实体类类型,也映射到数据库类型

    image

    3) 利用Code Smith生成窗体的模板代码,拷贝到窗体文件中.
    大部分窗体代码是基础性的,重复的。如果需要定制,请增加相应的代码到窗体中。窗体输入的验证代码已经在步骤2中,由LLBL Gen生成。 如不熟悉,请参考《信息化基础建设 窗体设计》

    这几步骤的操作,纯粹的体力活,不需要过多的考虑,框架已经足够好用。

    4 编译,发布与部署

    编译员工主档的代码,以管理员身份进入ERP系统,在系统功能中,增加员工主档这一笔记录,以开放此功能。

    这里,也可以做到自动扫描Assembly程序集的变更,加入新的功能。

    在权限设定中,给有需要的用户组,添加权限。如下图,默认的系统管理员组具备所有的权限:Read,Create,Update,Delte,Print,Post(过帐),Access All Tran(浏览所有数据记录)

    image

    Print,是指打印和查看报表的功能,这里的权限还不够细化。在KIS系统中,可以控制到只能浏览报表,而不能打印的权限,即使可以打印,也还控制到了打印的次数。一个小功能,只有精耕细作后,才可以称得上完美。

    到此,员工主档的表单开发,已经完成了。用Reflector查看程序集, 反射后的结果如下

    image

    好吧,我诚然,我隐藏了太多的细节操作,有些讲解也有些跳跃性,不连贯。

    对于熟悉框架的用户,要做的事情,就是这么多了。日常的表单开发,按照这四步开做,可以完成70%的表单。

    以下几条是我做WinForms开发的经验,分享一下

    1 如果是WinForms开发,请选择一个合适的ORM来做数据读写,配合BindingSource数据绑定,约减少40%的代码

    2 继承的作用是代码重用,尽可能的把公共方法放到基础类中,以获取OOP中继承的好处。
    以事件为例子,新增加一笔记录的按钮是btnAdd,在第一次,我们会这样做

    bntAdd.Click+=btnAdd_Click;  新增加一笔记录
    利用继承的原理,把这个按钮和事件放到基类中,可以这么写
    public class FormBase {

    protected void RegisterCommonAction()

    {  

        bntAdd.Click+=btnAdd_Click ;

    }

    void btnAdd_Click(object sender,EventArgs e)
    {

    Add(null);

    protected virtual void Add(EventArgs e)

    {

    }

    这样,让员工主档的窗体,继承于FormBase, 只需要重写Add方法,就可以挂接btnAdd按钮的新增事件

    protected overrid Add(EventArgs e)

    {

    }

    这个模式可以为WinForms开发减少大量的重复性代码。


    3 对于动态布局,或是界面动态生成的WinForms应用,可考虑把他们放到FlowLayoutPanel中,增加布局的灵活性。

    4 为WinForms窗体选择一致的合适的字体,我常用的字体是Calibri,9pt.
    label与其texteditor之前的间距,control之间的间距控制为标准的12pt.

    不轻易改变控件的样式或主题,比如,不模仿QQ的蓝色皮肤,也不要模仿Office 2007的菜单样式,如下图

    image_thumb23

    这个菜单是模仿Office 2007的菜单蓝色,这是个败笔,因为它的背景窗体与其蓝色菜单搭配起来,很不一致。

    上面提到的QueryForm 用户自定义查询窗体,也有蓝色的背景控件,我一直把这当成是败笔,一致性没有做好。

    5 对于rich client这一层的开发,WinForms已经足够好用,开源的控件也足够多,挑选几个控件,做成你自己的Component Library,在这个基础上开发,比每次都用VS自带的控件要好,不断的用,不断改善。自定义的控件,你有源码,也就意味着掌握了控制权,Component Library的一个小更新,可以解决所有的客户的问题,这个好处实在是方便。目前我认为的,最值得推荐的网站是codeproject.com.

  • 相关阅读:
    如何优雅地「蜗居」?
    TCP三次链接和四次断开
    linux文件系统目录
    Linux sync命令的作用分析
    system()函数
    linux 端口设置结构体 struc
    Linux内核的三种调度策略
    setsid
    Android通过NTP服务器取得UTC标准时间
    fprintf输出到文件中,sprintf输出到字符串中. 如: fprintf(fp,"%s",name); fp为文件指针 sprintf(buff,"%s",name); buff为字符数组
  • 原文地址:https://www.cnblogs.com/JamesLi2015/p/2134422.html
Copyright © 2011-2022 走看看