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.

posted @ 2011-08-11 09:13  信息化建设  阅读(3486)  评论(8编辑  收藏  举报