一、基础技术选型

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项目中应用到的技术和工具的更多相关文章

  1. 文档驱动开发模式在 AIMS 中的应用与实践

    摘要:程序员常会说:我最讨厌别人写的代码没有文档,我也最讨厌自己需要写文档. 有一个很老的梗: 我最讨厌别人写的代码没有文档,我也最讨厌自己需要写文档. 有这种想法的程序员应该算是一个老鸟了,对于大多 ...

  2. Expo大作战(六)--expo开发模式,expo中exp命令行工具,expo中如何查看日志log,expo中的调试方式

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,将全部来与官网 我猜去全部机翻+个人 ...

  3. 使用反射+策略模式代替项目中大量的switch case判断

    我这里的业务场景是根据消息类型将离线消息存入mongoDB不同的collection中.其中就涉及到大量的分支判断,为了增强代码的可读性和可维护性,对之前的代码进行了重构. 先对比一下使用反射+策略模 ...

  4. 全栈之路-小程序API-SpringBoot项目中参数校验机制与LomBok工具集使用

    参数校验机制在web开发中是非常重要的,每当看到现在所在公司的校验代码,我都有头疼,每一个接口都是重新写参数的校验,有些复杂的接口,参数的校验甚至占了整个接口代码量的挺大一部分的,看着我都有些头疼,我 ...

  5. cocos2d-x开发: 如何从项目中分离出接口范例

    cocos2d-x开发,包括核心模块接口开发和脚本部分的业务逻辑实现.从上层应用需求开始说,脚本在做业务逻辑实现的时候, 很多时候都需要依赖底层的接口功能,但是不是所有的人都可以游刃有余的去明白该怎么 ...

  6. SD卡两种操作模式在项目中应用的比较

    1.SDIO接口传输速度比SPI接口传输速度快:2.STM32的SDIO口还真的不好用 特别是4BIT的方式 我都纠结了好久了 用1BIT的方式倒是可以 速度大概可以到读2M字节每秒(STM32F20 ...

  7. C#.NET常见问题(FAQ)-使用SharpDevelop开发 如何在项目中添加类文件

    点击文件-新建-文件,然后再工程内创建文件   或者工程-添加-新建项     更多教学视频和资料下载,欢迎关注以下信息: 我的优酷空间: http://i.youku.com/acetaohai12 ...

  8. java模板模式项目中使用--封装一个http请求工具类

    需要调用http接口的代码继承FundHttpTemplate类,重写getParamData方法,在getParamDate里写调用逻辑. 模板: package com.crb.ocms.fund ...

  9. 一个JavaWeb项目中使用的部分技术

    -- 2015年8月8日 1. Web框架: Spring+ SpringMVC + MyBatis Spring: 作为容器.工厂,用于解耦以及管理对象生命周期. 整合各类框架和依赖. MVC  : ...

随机推荐

  1. 闰秒导致MySQL服务器的CPU sys过高

    今天,有个哥们碰到一个问题,他有一个从库,只要是启动MySQL,CPU使用率就非常高,其中sys占比也比较高,具体可见下图. 注意:他的生产环境是物理机,单个CPU,4个Core. 于是,他抓取了CP ...

  2. 【探索】在 JavaScript 中使用 C 程序

    JavaScript 是个灵活的脚本语言,能方便的处理业务逻辑.当需要传输通信时,我们大多选择 JSON 或 XML 格式. 但在数据长度非常苛刻的情况下,文本协议的效率就非常低了,这时不得不使用二进 ...

  3. iOS二维码生成、识别、扫描等

    二维码扫描 前言: 最近的项目中使用到了二维码,二维码这个模块功能也完成:觉得还是有必要总结一下用来做记录.好长时间没有写二维码了都忘记在差不多了,重新拾起来还是挻快的. 二维码使用场景: 生活中有很 ...

  4. CI Weekly #10 | 2017 DevOps 趋势预测

    2016 年的最后几个工作日,我们对 flow.ci Android & iOS 项目做了一些优化与修复: iOS 镜像 cocoapods 版本更新: fir iOS上传插件时间问题修复: ...

  5. 消息队列性能对比——ActiveMQ、RabbitMQ与ZeroMQ(译文)

    Dissecting Message Queues 概述: 我花了一些时间解剖各种库执行分布式消息.在这个分析中,我看了几个不同的方面,包括API特性,易于部署和维护,以及性能质量..消息队列已经被分 ...

  6. 小兔JS教程(三)-- 彻底攻略JS回调函数

    这一讲来谈谈回调函数. 其实一句话就能概括这个东西: 回调函数就是把一个函数当做参数,传入另一个函数中.传进去的目的仅仅是为了在某个时刻去执行它. 如果不执行,那么你传一个函数进去干嘛呢? 就比如说对 ...

  7. 解决“chrome提示adobe flash player 已经过期”的小问题

    这个小问题也确实困扰我许久,后来看到chrome吧里面有人给出了解决方案: 安装install_flash_player_ppapi, 该软件下载地址:http://labs.adobe.com/do ...

  8. 使用Microsoft的IoC框架:Unity来对.NET应用进行解耦

    1.IoC/DI简介 IoC 即 Inversion of Control,DI 即 Dependency Injection,前一个中文含义为控制反转,后一个译为依赖注入,可以理解成一种编程模式,详 ...

  9. 使用rowid抽取数据方法以及大数据量游标卡住的应对

    平时工作的时候,经常会遇到这种事情,从一个大表A中,抽取字段a在一个相对较小B的表的数据,比如,从一个详单表中,抽取几万个用户号码的话单出来.这种时候,一般来说, 做关联查询: create tabl ...

  10. iOS之应用版本号的设置规则

    版本号的格式:v<主版本号>.<副版本号>.<发布号>  版本号的初始值:v1.0.0 管理规则: 主版本号(Major version) 1.  产品的主体构件进 ...