.NET底层开发技术

上传人:油条 文档编号:11769615 上传时间:2017-10-15 格式:DOCX 页数:8 大小:390.87KB
返回 下载 相关 举报
.NET底层开发技术_第1页
第1页 / 共8页
.NET底层开发技术_第2页
第2页 / 共8页
.NET底层开发技术_第3页
第3页 / 共8页
.NET底层开发技术_第4页
第4页 / 共8页
.NET底层开发技术_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《.NET底层开发技术》由会员分享,可在线阅读,更多相关《.NET底层开发技术(8页珍藏版)》请在金锄头文库上搜索。

1、工作多年后才明白的.NET 底层开发技术作者: James Li参加工作已经有五年了。由于是非计算机科系,一开始的工作是做网页,维护ASP 脚本程 序,有时候也要做图片,总而言之,一项任务交到手里,没有借口说不会做,想办法弥补然后把任务做完。后来才得到机会,参与编程开发工作。而且,当时一心想 用 C#.NET 做开发,不希望参与 DELPHI 的开发,偏偏工作经过层层的转发,交到手里的就是 DELPHI 开发。经历努力,再后来就真的用.NET进行 开发工作,一直持续到现在。消极的观念会说,学的很杂,做的也杂,积极一点的想法,把老板交给你的任务完成,就是称职的员工。现在正值毕业生找工作的时 间,

2、一时找不到开发的工作,也不要急,先听从公司的安排做个软件测试,或是文档管理之类的职位,等有空缺的开发人员的机会,你再毛遂自荐,同样可以进入程 序员这个领域。机会是留给有准备的人的,难道不是吗?一直用.NET 做 ERP/MIS 类型的软件,学业不精,可以完成工作任务,业余时间也制作一些集成化的工具包,下面分享一下我认为的.NET 领域里的底层技术。 1 通信技术(Remoting,WCF, ASMX)通常的三层架构,数据库,数据访问层,界面层。通讯技术定义了三层组件之间的调用约定,以及方法。这样说起来有些抽象,举例为证。现在要制作一个进销存项目,基本的功能是进仓,出仓,转仓,查询功能要能查询到

3、仓库进出日记帐, 库存余额。对于一笔物料为 FLEX0901 的进仓业务,用 ORM 的方式完成,伪代码如下 InventoryMovmentEntity receipt=new InventoryMovmentEntity(“REF1108080001”,RECEIPT”); InventoryMovmentDetailEntity detail=receipt.InventoryMovmentDetails.AddNew(); detail.ItemNo=”FLEX0901”; detail.MoveDate=DateTime.Now; InventoryMovementDAL.Insta

4、nce.Save(receipt); 这里有几个问题处理的不错,比如 1) ORM 的数据读写,关注面从拼凑 SQL 读写到构建实体,这是进步。如果用DAL+SQL Script 的方式完成,伪码如下 string mySql=”INSERT ICMOVH(RefNo,Direction) VALUES(REF1108080001, RECEIPT) ; InventoryMovementDAL.Instance.ExecuteNonQuery(mySql); mySql=”INSERT ICMOVD(ItemNo,MoveDate) VALUES(FLEX0901,2011/8/8) ; I

5、nventoryMovementDAL.Instance.ExecuteNonQuery(mySql); 这里省略了拼凑参数值的句段,直接把值放到 SQL 语句中去。 后一种方式,明显的缺陷时,当添加新的字段,对系统扩展时,修改和维护起来的成本,明显大于前者。 2) 使用了单件模式,InventoryMovementDAL.Instance 来统一操作数据读写,而不是这样 InventoryMovementDAL inventoryDAL=new InventoryMovementDAL(); inventoryDAL.Save(receipt); 从这个单件模式,引出了通讯技术的必要性。当有

6、很多个用户,同时操作进仓功能,意味着同时有很多个 InventoryMovementDAL 的数据写入操作,这时产生的问题 1)不好控制前后两张单据的进仓单参考编号重复。为保证不重复,在保存之前,我们需要到数据库检查一次是否已经存在该参考编号的进仓单,也就是InventoryMovementDAL 的 Save 方法的开头, 要包含这样一段代码,以 DAL+SQL Script 的方式表示 string mySql=” SELECT COUNT(1) FROM ICMOVH WHERE RefNo=REF1108080001 ; bool existing=InventoryMovementD

7、AL.Instance.ExecuteScalar(mySql)0; 可以想像,当并发用户为 100 时,每一笔进仓业务,需要预先一次数据检查,来回于数据库,这样的程序性能肯定不好。 2 )对于库存报表,多个并发的 InventoryMovementDAL 会导致数据前后不统一。库存余额报表现在可以读到物料 FLEX0901 还有 100 个 pc,一会当有进仓单入库200pc 的 FLEX0901 时,如果不手动刷新数据,此时的报表仍然显示的物料FLEX0901 的库存余额是 100,而不是 300. 这有时候是不可接受的结果。 可以做一个 timer,定期刷新库存余额。这里的问题 是,In

8、ventoryMovementDAL 只有一个实例,无法自己告诉自己,已经有新的库存了,重新读取数据。这里需要一种并发机制,告诉 InventoryMovementDAL 实例,有新的数据加入到库存余额中,需要刷新报表。 3)有一些数据项,是全局的,对于整个系统都是唯一的,需要特殊处理。 比如 ERP 系统允许的并发用户,同时允许有 10 个用户连接进入系统,超过则无法处理; ERP 系统的一个用户把当前系统的默认货币从 HK$改进了 US$,其它的用户,要能知道这个改变,此时,不太可能让当前正在操作业务的用户退出,重新进入系统; 当 发生网络故障时,ERP 系统要能知道网络故障,并 susp

9、end 当前正在进行的操作;这一点可以理解为一条有效的改善,当无法连接到 SQL Server 时,要阻止当前正在录入数据的用户,否则他很辛苦的录入了数据,而系统又无法保存,给出一个提示 A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Ser

10、ver is configured to allow remote connections 用户会抱怨你的软件没有做好,尽管这不是你的错。 如下图,当前用户正在编辑客户资料,发生网络故障,界面被 Disable 了。借助于通讯技术中的并发,可以实现。 通篇都没有给 Remoting,WCF 打广告,说 Remoting,WCF 的好处。当你的程序遇到这几个问题时,是否可以考虑下通讯技术,来改善性能和客户体验。 2 反射,动态编译反 射是动态获取程序集的元数据的一种技术,这句话是做.NET 程序员面试题目的一个的答案,你可选择记住它,就好比高中生物学里面讲到的细胞的结构的课程 时,细胞由细胞膜,

11、细胞质和细胞核组成。根据做程序的经验,Never ask why 不是好习惯,即使是微软的 API,有时候违反了调用约定,也会很抓狂。请看下面这一段代码 Assembly assembly = Assembly.GetExecutingAssembly();object entryForm = Activator.CreateInstance(formBaseType) as Form;entryForm .MdiParent = this; entryForm .Show(); entryForm .Activate(); 代码的含义比较简单,从当前程序集中创建 formBaseType 类

12、型,并调用它的方法。从方法名上来看,大概可以看出,这是一段 MDI 创建 child 子窗体,并显示子窗体的代码。 这段小代码,也是插件式框架的基本思路,请参考Management Console 工具管理类软件通用开发框架(开放源码)中的例子来体会它的用处。 在 ERP/MIS 系统中,应用反射的例子,实在是太多了。数据访问接口InventoryMovementDAL,借助于反射,来查找并调用它的实现类; 窗体也它的子窗体借助于反射来获取属性,传递值;ERP 系统的整个框架,也是借助于反射搭建起来. 看 下面的图,ERP 的三个模块 Paradox.ERP.SystemAdministrat

13、ion, Paradox.ERP.Engineering,Paradox.ERP.Inventory 被Paradox.Framework.Kernal 反射 调用,如果再写一个 Paradox.ERP.Sales 的销售模块,几乎不需要改动,就可以让它被框架调用。动态编译的例子,是应用到一个工资系统中. 请看图 对于如何解析工资的 formular 公式,有若干种办法,这里使有的是动态编译的方法。把每一个工资项看成是一个类型 class 的属性,Formular 的内容则放到一个方法中去,当成表达式计算求职,最后应用反射,返回各属性的值即可。 public class FormularCal

14、culation public static object Build(string items, string formular) string nameSpace = A; string className = FormularCalculation; string methodName = Run; CSharpCodeProvider compiler = new CSharpCodeProvider(); CompilerParameters paras = new CompilerParameters(); paras.GenerateExecutable = false; par

15、as.GenerateInMemory = true; StringBuilder classSrc = new StringBuilder(); classSrc.Append( using System;+Environment.NewLine); classSrc.Append( namespace +nameSpace+ + Environment.NewLine); classSrc.Append(public class + className + + Environment.NewLine); foreach (string item in items) classSrc.App

16、end(public decimal + item + ; + Environment.NewLine); classSrc.Append(public void Run() 基本工资=5000; + Environment.NewLine); string format= Regex.Split(formular,Environment.NewLine); foreach (string prop in format) classSrc.Append(prop + ;+ Environment.NewLine); classSrc.Append(+Environment.NewLine); classSrc.Append( + Environment.NewLine); classSrc.Append( + Environment.

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号