摘要:该总结的东西都总结得差不多了,剩下的都是一些细枝末节的了,基本可以收尾了,这一篇讲一讲设计模式。设计模式是个什么东西,它其实只是前人在当前系统实现基本手段基础上提取出来的一些方法论,目的是为了更好更快的解决我们在系统实现中碰到的各种问题。其实如果总是处于那种“你来我往”的状态之中,没有静下心来细细的思量,无法把握到项目的全貌,没有精益求精的态度,那些方法论不用也罢。可幸这一次上述的如果都没有,所以...
阅读全文
摘要:这一篇其实没什么可讲的,只提一下跟客户端不太一样的一些地方。服务端跟客户端最大的区别是它面对的不是单单一个连接,而是有一些个连接。对于接收与发送来讲它是要具体到accept进来的每一个连接的,所以这里有一个SocketStateObject参数会贯穿始终,这个参数主要就是放对应客户端的Socket连接及一些状态变量,在accept进来一个连接后即创建一个这个对象。 public void List...
阅读全文
摘要:数据窗体的状态大概可以概括为以下几种,即初始、浏览、新增、修改、删除、查询(单数据窗体的查询是一种简单地基于当前表的查询,各个条件之间只能“与”运算,关系运算只有“等于”,当然字符串字段会有“like”)。在各种状态下,窗体的UI呈现是不相同的,而且在不同状态下,一些按钮的动作是各异的。比如“确定”按钮,在新增状态下按“确定”和在查询状态下按“确定”明显是不同的二种动作。上述的这些情况可以用GoF...
阅读全文
摘要:所谓的单数据窗体是指那种在窗体只显示一张单表的数据的窗体,主要就是用于显示基本表,因为这个系统要显示的差不多就是基本表为主,这一篇主要讲这个数据显示窗体的基类。既然是基类嘛,当然要提供一些虚方法给子类来改写,要有一些变量必须由子量来初始化。首先必须由子量来提供实例的变量主要是跟子类关联的数据表有关,因为窗体的始化及UI的呈现都是与数据有关的,所以上述变量的初始化必须是在构造函数的最开始的地方进行。...
阅读全文
摘要:经过上二篇的铺垫,现在终于可以加载菜单与工具栏了。先来看一下IService的接口实现里LoadCommand方法是如何来加载菜单与工具栏的:IService接口的实现Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--publicclassSignInR...
阅读全文
摘要:经过上一篇定义的两个接口,菜单与工具栏基本上符合了Command模式的样子,接下来应该可以在系统中加载了。但理论上照着模式是一回事,实实在在的写代码又是另一回事。我们很遗憾地发现ToolBarButton这个类根本没有单击事件,甚至跟UI有关的事件都没有一个,因为它根本就不是从Control继承的,而是从Component继承的。工具栏按钮单击是从工具栏ToolBar的ButtonClick事件来...
阅读全文
摘要:从这一篇开始要讲管控端是如何来加载菜单与工具栏的了,.Net Framework自带的菜单与工具栏用来做一个简单的小程序是大大胜任的。但用它们来实现一个可以称之为系统的东西则不够强大,变化多端的环境转瞬间就使它们的功能是捉襟见肘了,这里我们必须先要对它们做出一定的改造。菜单与工具栏只是UI的二种不同表现,二者在系统的动作执行上是没有什么不同的。由此说起二者的系统集成,一般都会提到Command这个...
阅读全文
摘要:本要接上一篇开始讲管控端程序的菜单与工具栏的加载,但发现还是先要讲一下整个管控端的窗体组织,否则会无法理解菜单事件为何要那么写。多窗体组织很经典的模型就是MDI了,但MDI在窗体最大化、最小化、还原一些动作之后,窗体会乱掉,很乱七八糟。现在的程序很少有用那种原始的MDI来作界面的了,至少我不会去用,实在是难看。但开发工具在这里也是没有长进,如果我们直接用IDE只能生成那种原始的MDI窗体。只能另想...
阅读全文
摘要:从上面我们知道现在管控端不再是一个孤零零的应用程序,而是由一些模块组成的,这些模块可能会根据不同情况有各种的组合,这样程序中就不能把模块写死了,而是得动态加载,反射又要派上用场了。 本来想如一些应用一样把业务模块当成是一个个的插件,然后把相应程序集放入类似于Plugins的目录,程序启动时到相应目录去寻找相应程序集这样的机制来加载的。但考虑到业务模块不会很多,引用的程序集也不会很复杂,可以预见...
阅读全文
摘要:前面几篇基本把签到终端的各个模块描述了一下,至此签到终端的主程序要做的事情相对就简单了许多,但实际实现中还是化了不少的精力,跟UI相关的东西做些来总是很费力的。不过相对来讲技术含量就低了,何况当时也是没有很深思熟虑(即使是UI的呈现本可以做得更好些的),所以这里也没有什么好谈的了。需要进一步提炼的地方以后专门开篇讲,接下来就开始着眼于管控端。 签到终端的模块划分比较着重于技术架构,那管控端...
阅读全文
摘要:在上一篇里我们根据签到系统的需求,提取出了硬件访问的公共接口,所有硬件设备只要实现了那个接口,我们的系统就可以方便地调用到,从而屏蔽了各种硬件API的异同对系统的影响。 上篇主要讲了逻辑隔离,这一篇要讲物理隔离。考虑到以后有更换硬件设备的可能(这个考虑现在看来非常的具有先见之明,在半年多前S6500这款设备在TI网站上就发现已经Discontinue了),我把不同硬件设备的接口实现放入了各自不...
阅读全文
摘要:这一块是整个系统的重中之重了,签到系统能否达到客户的要求,最大的瓶颈可能就是在这一块。因为无论是数据库还是Socket通讯,相对来说都还是比较成熟的技术,对于我们软件开发人员来说也比较的熟悉一点,故障排除、性能优化等等可寻求的参考与帮助也比较的多。而涉及硬件的开发对于纯粹的软件开发人员来讲就有点陌生,更何况RFID设备也还不是很成熟的设备。如果你用的是国际知名厂商的产品还好,无论是设备性能、稳...
阅读全文
摘要:上一篇Socket封装只是一个技术的封装,是为了隐藏一些技术细节,这一篇主要是通讯组件的逻辑封装。 这里基本没有什么可谈的,只是到处调用上一篇里的方法而已。比如读取配置连接远程主机啦,关闭Socket连接啦,组合字符串发送命令啦等。 这个地方最费事的是SocketPack的OnReceive事件的处理,这个事件在Socket接收到远程主机的命令时会触发。 private void...
阅读全文
摘要:Systems.Net.Sockets之下的Socket类在.Net Framework里是显得比较怪异的一个类,因为它其实就是Win32 时代Winsock的托管代码版本。它的编程理念与现如今是有点不匹配的,它是不能直接拿来作为我们通讯组件的技术基底的,我们根据系统的要求先要对它作一定的技术封装,以求减少在组件层暴露太多的技术细节。 很遗憾,以前并没有用Winsock API实现过系统的经历...
阅读全文
摘要:实现数据同步的正规做法是用SQL-Server的复制功能,但复制在这里显得有点小题大做。 从一开始在考虑客户端数据库时鉴于数据量的大小及客户端的其他需求,就决定为用MSDE,在每一个签到终端安装一个SQL-Server无疑是很浪费的。考虑到为了系统以后有更广的适用性,使用绑定数据库平台的技术也不是一种很好的选择。更为重要的是在系统中,数据同步压力并不是很大,情况也不复杂,需要动态更新的就一张表...
阅读全文
摘要:数据访问是所有要与数据库打交道的系统的最基础模块,也是在当今开发领域中提供现成解决方案最多的。其中一方面当然是各位开发者的习惯性思维,几乎每一位有追求的程序员都不会写出令自己摇头的代码,总是力求使系统的实现接近于自己的“理想”,而数据访问由于数据库的多样性及数据库SQL语法与现今流行的OO思想不适配,给予了程序员们以很大的发挥空间,所以造就了此领域的“百花齐放”;另一方面则是世界事物的复杂性,...
阅读全文
摘要:关于读配置,上次还漏说了一种情况,就是配置文件不是通常的由app.config生成的,其名字与程序集名字不相关的的时候,我们得自己写类似于GetConfig的方法来读取。这个种时候与写配置文件的功能有相通之处,所以放在这一篇里讲。 先来个读写配置文件的基类ConfigIOBase。 读写配置文件的基类Code highlighting produced by Actipro CodeHigh...
阅读全文
摘要:由于在XML处理方面的长足进步,现在写程序在配置方面比之以前是方便多了。比如在.net 1.1里,对于很简单的配置,用节就可以轻而易举的解决问题,你要读取配置一行代码就解决问题了。即使是要配置的变量稍微多一点,但化繁为简后用上述方法也可以胜任。(不过我看到过上百个在同一个配置文件里,这样的话呢就太恐怖了,不知那是如何维护的) 这个系统要配置的东西不算很多,不过有几点比较的棘手。首先是有些变量是...
阅读全文
摘要:这一篇还没准备进入实质性的阶段,先插段事关整个系统的异常处理部分。 最基本的原则当然是所有有可能影响到系统正常运行的异常都要Catch,并作记录,所谓最基本的原则当然只能是到具体实现的阶段把握了。但总有百密一疏,挂万漏一的时候,对于这些漏网之鱼必须在Application.ThreadException与AppDomain.CurrentDomain.UnhandledException事件中...
阅读全文
摘要:这一篇先从整体上讲述一下系统的各个模块,理一理系统的面目的形成过程。 首先明确的一点是这将是一个CS的系统,系统有离线的要求,而且更重要的是客户端要访问硬件设备,而且客户端的显示刷新是要达到准实时要求的,这些东西用BS的架构是难以实现的。 开发环境先确定下来就是VS.NET 2003、SQLServer 2000。当时VS2005及SQLServer 2005虽然已经越来越多的被使用,的确也是...
阅读全文