周末粗略解剖了一下IssueVision, 发现有些地方跟我目前项目的做法很相似

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!

posted on 2004-04-19 10:53  steeven  阅读(12596)  评论(19编辑  收藏  举报