学习IssueVision,开发MyVision
现在学到了IssueVision的一些特色,自己开发了一个东西
当然借鉴了IssueVision的很多东西
用到的多的就是Observer和Command两个设计模式
对于较简单的Command模式,我实现了通过菜单项,ToolBarButton,LinkLabel的Command模式,就是在这些事件实施表现层和业务逻辑实现层中间加了一个Commander,达到了多对一的目的,简化了代码,清晰了结构.
对于Observer模式,我现在主要是对于MainForm加了一个Subject
然后让StaffPane和InfoPane订阅这个Subject,来Observer这个Subject.从而实现界面显示的灵活性
我做的这个东西的功能是想实现一个类似Serv-U的功能
当然最重要的数据只有一个就是用户信息,如果用数据库的话只需要一个User表,我曾经想过要用一个xml文件,但是因为前段时间弄那个lib,所以就偷懒了,直接用codemaker生成了一个MyLib,然后在主Project-MyVision里引用MyLib,实现了对SqlServer数据库的操作
接下来的日子里需要做的是继续研究IssueVision里面还没有分析透但是又是他独到的地方,然后想办法加以利用,还有就是我那个serv-u在本地机器(既做服务端又做客户端)测试一点问题都没有了,但是分开在两个机器测就是不行,其中控制链路已经成功建立并成功处理了一部分命令,但是对于数据链路始终没有成功.这个问题一旦解决,整个project就没有什么深层次的技术问题了
下面是IssueVision网上搜到的特性
1. web service
采用web.config保存数据库连接字符串,即在服务器上存取数据库,对外通过web service提供服务。
理论上web service是标准的服务,所有离线处理和同步都在客户端程序中执行。
Common: 公共类, 用于数据库连接字符串的存取,并确认是否采用明文或加密串
CredentialSoapHeader: 用于验证时需要传递的soap信息,主要包括username/password
EventLogHelper: 日志记录 (在IssueVision中也有一个相同的类,为什么两者没有单独出一个dll,可能是因为防止下载时文件太大,即客户端不需要单独的DLL.)
IssueVisionService: 真正的WEB service 提供者, 在其对外的三个方法中,都需要进行验证才能使用. 主要是得到变化的DataSetIssue集合,然后同步到数据库中,并返回数据库最新的列表,同时将变化添加到日志表中
IVData: 数据库存取的类, 各个表的存取和数据变化时事件触发后的执行.
主要的方法: GetLookupTables(), 填充Staffers和IssueTypes到DataSet中
SendReceiveIssues(changedIssues, lastAccessed)
IVDataSet: 一个实体对象, 用于在web之间传递的对象, 即客户端和服务器之间传递的对象, 是一个xsd文件,可以直接在里面设计表结构,即存取时的表对象,XML语法格式. 在vs.2005出来之后可能要使用ObjectSpace. (faq: 是否这里的表对象必须与DB中的一致?)
SecurityHelper: 一个用于身份验证的类, 即根据提供的CredentialSoapHeader,从数据库中取得信息进行判断,如果要用windows集成或AD域认证模式,需要修改此类。
DataProtection: 数据加解密。
ThreadHelper.dll: 提供线程相关组件
SplashScreen 闪现的屏幕
SingletonApp 唯一程序,第二个实例不会动作
SafeLabel -- 可在多线程下安全操作的Label
BackgroundWorker 后台工作程序
RunWorkerAnsy() 开始后台工作
DoWorkEventHandler 后台执行开始事件 执行异步任务
RunWorkerCompletedEventHandler 后台执行结束事件
ReportProgress() 报告后台进度
ProgressChangedEventHandler 进度改变事件 用于画进度条
CancelAnsync() 取消后台任务
IssueVisionWeb :
IssueVisionWebservices.asmx:
IVData: 组件. 调用dataadapter实现数据操作,含业务逻辑.
SecurityHelper: 封装了安全认证操作
Common: 读取配置
EventLogHelper: 辅助操作EventLog
IssueVision:
WebServiceLayer: 提供WS访问的中介. URL从配置文件读取. CredencialHeader从登陆用户取得.
UserSettings: 当前用户的状态和状态的本地缓存
SerializationHelper: 数据到文件的加密存储
DataProtection: 调用Win32API实现的加密解密
LoginForm: 登录. 被MainForm调用. 窗体淡入淡出.
IssueSubject: ISubject 业务模型Model
SaveIssueData() 保存业务数据到本地文件
LoadIssueData() 加载业务数据
AppUpdator: SmartClient的关键。自动保持版本更新。
数据采用DataSet保存和传递,不论客户端还是Web服务端。
数据访问采用自动生成的DataAdapter。
IssueSubject作为整个程序的业务模型,对外提供数据、数据时间、存储、更新等动作。
窗体中的各个显示控件监听数据变化事件,有变化时调整自身需要显示的部分。
冲突检测:
客户端从Dataset.GetChanges()取得有修改的数据通过Web服务提交到服务器。
Web服务在提交用户的改动时监听DatatAdapter的UpdateError事件,把有冲突的数据放到Conflict表中返回给客户端。
实际上利用了DataAdapter的并非冲突检测功能。
WHY:
1. 客户端为什么没有使用IsolatedStorageObject来保存临时数据?
2. 冲突数据的保存是利用DataSet中新建的表Conflict。如果有N个业务表需要检查并发冲突,DS中就需要2N个表。是不是可以还放在原来的表中,只是设定一个RowError呢?
3. AppUpdater是不是可以注册到WindowsUpdate中,由系统一起完成呢?重复功能,bad smell!