企业应用开发模式 ERP项目中应用到的技术和工具
一、基础技术选型
C# .NET 3.5/4.0 这两个版本的.NET已经相当方便(Linq, Lambda,Parallel),语法简洁,配合WCF和WF两项技术,可以满足快速开发,维护方便的目标。
Win Form 因ERP项目涉及大量的表单(Entry),查询(Enquiry),报表(Report),我以为WinForm仍然是首选技术。自定义控件,数据绑定,自定义窗体,这三项技术组合起来可产生无穷的威力。
SQL Server 2005 取兼容性最好的一个版本。2008/2008 R2/2012均不向后兼容,旧版本数据一旦附加到新版本中后,便不可以在旧版本的SQL Server中附加,备份集也不可以向后兼容。
二、五大核心模块
为保持ERP产品的可配置性,可维护性,首先定义以下基础模块,构建基础的ERP功能集合。这些基础模块是我从工作中接触到的几个ERP产品中总结出来,具备代表性。
菜单设计器 Menu Designer ERP项目的菜单,导航应该具备可编辑,可调整的特性。菜单和导航数据一般保存于数据库中,或是Xml文件中。
查询设计器 Query Designer ERP项目涉及大量的数据表单,数据查询的需求非常频繁。SQL Server Management Studio是开发人员的查询设计器,在此基础上做一个封装,限定可查询的数据库和资料表,考虑查询权限,拒绝任意的数据修改和删除语句片段以保护数据,最后将数据以列表或网格形式呈现。
报表设计器 Report Designer 同查询的需求一样,如果需要将数据打印成完整的格式,ERP项目应该具备增加自定义报表的特性。兼容当前流行的Crystal Report和Reporting Services。
工作流设计器 Workflow Designer ERP项目有内建的约定的流程,同时也应该满足批核,通知等特性。
窗体设计器 Form Designer ERP项目应该具备调整和自定义布局的特性。不同的权限和用户,所看到界面应该有所差异。借助于此窗体设计器,调整窗体布局,满足个性化布局的需要。
三、实体映射框架层模式
1 Entity Framework , LLBL Gen,NHibernate
ORM的基础原理是在数据库与面向对象编程中的对象之间做一层封装,以简化数据读写。在性能的反应上,ADO.NET是最好的,它直接工作在数据库驱动层上。ORM则在ADO.NET上做一层封装。关于可维护性,代码生成器可弥补ORM对数据库修改的感知。当发生数据库变更时,直接以生码生成工具重新生成实体代码即可。关于可编程性,强类型的对象,可满足数据绑定时的数据感知需求,节省开发和维护时的成本。
2 ORM高级查询,SQL语句追踪,性能优化
应用ORM做数据访问层的难点在于数据查询,抛弃现有的SQL语句知识,应用OOP语言来做查询,十多行代码是为达到一个子查询的目的,一句SQL语句可替代。涉及数据问题时,还需要借助于SQL Server Profiler工具来诊断问题。
四、界面层模式
1 自定义控件,窗体基础类型定义的原理与实现,数据绑定技术
以WinForm技术而言,继承是为代码重用的重要收益。定义以下几个基础窗体
Entry Form:数据输入窗体,比如销售单,采购单,工作单。
Enquiry Form:数据查询窗体,比如销售单日记帐查询,采购送货查询。
Report Form:报表窗体,读取报表的参数信息,从数据库中抓取数据并呈现报表。
自定义控件是为满足数据绑定的需要,还增加其它特性,比如限制输入长度,只读,可写,大小写,半角全角自动转化等控制。
2 业务逻辑与业务验证
应用ORM编程带来的一大收益是界面与逻辑分离。OOP对象既可代表数据库中的表在内存中的实体,也可包含丰富的自定义逻辑,再加上验证框架,这二项内容的分离和耦合,极大的增强代码的可维护性。
ASP.NET MVC已经强制模型M和界面V的分离,用控制器将它们联系在一起,在数据呈现和数据逻辑方面,相对于Web Form无论是开发,还是维护都轻松很多。
五、功能开发模式
1 框架数据库与业务逻辑数据库,定义代码模块(Module),定义功能(Function)
因为多增加一个数据库框架,与系统通用功能相关的信息都放置于框架数据库中,比如帐套配置,比如查询定义,比如菜单和导航信息。框架数据库承担系统方面的功能载体,与具体的业务功能分离。
2 窗体界面设计 查询(Enquiry)和查找(Lookup)设计,业务逻辑,验证
在第二项内容(五大核心模块)的基础上,ERP项目继续以插件的方式,定义模块,定义功能。一个模块可以简单的理解为一个Visual Studio 项目文件,相关的功能都聚集在其中。销售Sales模块中有报价单,销售单,销售送货,销售退货等功能。
模块中的功能,以第四项内容中提及的方法分三类Entry,Enquiry,Report三大基础业务功能。
此项内容为ERP开发中的日常任务。以ERP的任务分类,Enhancement,Bug Fix,Data Fix三大分类,绝大多数的任务均在此目录中。因Bug带来的数据修复,会给ORM技术团队带来压力。系统产生的数据问题,不再是可以简单的从系统中拷贝一些SQL语句,ORM做为基础的数据访问没有SQL。以我的体会,ORM并不是要你忘记SQL的存在,在应用ORM保存数据之后,我常会以SELECT * FROM table之类的语句去审查数据表中的记录,以确保数据值和数据验证,数据关联为正确。
六、开发工具推荐
SQL Toolbet SQL Server领域中的Intellisense,好比Visual Studio中的智能提示一样,必备工具。
JetBrain Resharper 当实体与实体间的关系,接口与实现的关系日益复杂之后,Find Usage和Go to Implementation两项功能,可帮助诊断问题,必备工具。
Resharper的Test功能也相当优秀,直接对一个测试方法启动调试,我对单元测试的热爱,源自于此功能。做好一个基础功能,会同样做一个测试方法,以此功能调试跟踪,观测代码的执行。
Code Smith 辅助代码生成工具,必备工具。具备大量的例子,入手容易,案例多,应用广泛。
企业应用开发模式 ERP项目中应用到的技术和工具的更多相关文章
- 文档驱动开发模式在 AIMS 中的应用与实践
摘要:程序员常会说:我最讨厌别人写的代码没有文档,我也最讨厌自己需要写文档. 有一个很老的梗: 我最讨厌别人写的代码没有文档,我也最讨厌自己需要写文档. 有这种想法的程序员应该算是一个老鸟了,对于大多 ...
- Expo大作战(六)--expo开发模式,expo中exp命令行工具,expo中如何查看日志log,expo中的调试方式
简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,将全部来与官网 我猜去全部机翻+个人 ...
- 使用反射+策略模式代替项目中大量的switch case判断
我这里的业务场景是根据消息类型将离线消息存入mongoDB不同的collection中.其中就涉及到大量的分支判断,为了增强代码的可读性和可维护性,对之前的代码进行了重构. 先对比一下使用反射+策略模 ...
- 全栈之路-小程序API-SpringBoot项目中参数校验机制与LomBok工具集使用
参数校验机制在web开发中是非常重要的,每当看到现在所在公司的校验代码,我都有头疼,每一个接口都是重新写参数的校验,有些复杂的接口,参数的校验甚至占了整个接口代码量的挺大一部分的,看着我都有些头疼,我 ...
- cocos2d-x开发: 如何从项目中分离出接口范例
cocos2d-x开发,包括核心模块接口开发和脚本部分的业务逻辑实现.从上层应用需求开始说,脚本在做业务逻辑实现的时候, 很多时候都需要依赖底层的接口功能,但是不是所有的人都可以游刃有余的去明白该怎么 ...
- SD卡两种操作模式在项目中应用的比较
1.SDIO接口传输速度比SPI接口传输速度快:2.STM32的SDIO口还真的不好用 特别是4BIT的方式 我都纠结了好久了 用1BIT的方式倒是可以 速度大概可以到读2M字节每秒(STM32F20 ...
- C#.NET常见问题(FAQ)-使用SharpDevelop开发 如何在项目中添加类文件
点击文件-新建-文件,然后再工程内创建文件 或者工程-添加-新建项 更多教学视频和资料下载,欢迎关注以下信息: 我的优酷空间: http://i.youku.com/acetaohai12 ...
- java模板模式项目中使用--封装一个http请求工具类
需要调用http接口的代码继承FundHttpTemplate类,重写getParamData方法,在getParamDate里写调用逻辑. 模板: package com.crb.ocms.fund ...
- 一个JavaWeb项目中使用的部分技术
-- 2015年8月8日 1. Web框架: Spring+ SpringMVC + MyBatis Spring: 作为容器.工厂,用于解耦以及管理对象生命周期. 整合各类框架和依赖. MVC : ...
随机推荐
- RabbitMq应用二
在应用一中,基本的消息队列使用已经完成了,在实际项目中,一定会出现各种各样的需求和问题,rabbitmq内置的很多强大机制和功能会帮助我们解决很多的问题,下面就一个一个的一起学习一下. 消息响应机制 ...
- OpenCASCADE BRep Projection
OpenCASCADE BRep Projection eryar@163.com 一网友发邮件问我下图所示的效果如何在OpenCASCADE中实现,我的想法是先构造出螺旋线,再将螺旋线投影到面上. ...
- 谱聚类(spectral clustering)原理总结
谱聚类(spectral clustering)是广泛使用的聚类算法,比起传统的K-Means算法,谱聚类对数据分布的适应性更强,聚类效果也很优秀,同时聚类的计算量也小很多,更加难能可贵的是实现起来也 ...
- iOS开发之Alamofire源码深度解析
今天博客中的Alamofire源码的版本是以现在最新的3.4版本为例.上篇博客系统的对NSURLSession相关的东西进行了详细的解析,详情请看<详解NSURLSession>,为了就是 ...
- MySQL碎碎念
1. 如何修改Mysql的用户密码 mysql> update mysql.user set password=password('hello') where user='root'; mysq ...
- 用C语言封装OC对象(耐心阅读,非常重要)
用C语言封装OC对象(耐心阅读,非常重要) 本文的主要内容来自这里 前言 做iOS开发的朋友,对OC肯定非常了解,那么大家有没有想过OC中NSInteger,NSObject,NSString这些对象 ...
- vs15 preview5 离线安装包
1.介绍 vs15是微软打造的新一代IDE,全新的安装方式.官网介绍如下(https://blogs.msdn.microsoft.com/visualstudio/2016/10/05/announ ...
- bzoj3095--数学题
题目大意:给定一个长度为n的整数序列x[i],确定一个二元组(b, k)使得S=Σ(k*i+b- x[i])^2(i∈[0,n-1])最小 看Claris大神的题解就行了.实际上就是用2次二次函数的性 ...
- beans.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- js刷新页面方法大全
如何实现刷新当前页面呢?借助js你将无所不能. 1,reload 方法,该方法强迫浏览器刷新当前页面.语法:location.reload([bForceGet]) 参数: bForceGet, ...