Composite UI Application Blocks 点滴(一)
前段时间学习了一下CAB,在正式的运用的时候还是出现了一些问题。在这里记录一下,供大家参考。
(1)SmartPart加载问题
都怪我没有看清E文的说明,在labs的代码中相应的地方作了说明——如果加载的窗体上有SmartPartHolder的话,并且要在主窗体加载的时候显示相应的SmartPart,应在WorkItem 的Run方法中,在Show出主窗体之前应该,先Creat Smartpart。代码如下:
- public void Run(IWorkspace workspace)
- {
- //先Create 相应的SmartPart
- Create<CustomerQueueView>("CustomerList");
- mainView = Create<BankTellerMainView>();
- //再Show主窗体
- workspace.Show(mainView);
- }
(2)在 State 中存放数据
State中就像Asp.net中的Session一样好用,并且只在WorkItem的范围中有效。但是使用的方式有点不同。
- //在workItem的类中这么写是可以的。
- public MedicalCase PatientMedicalCase
- {
- get
- {
- return (MedicalCase)State["patientMedicalCase"];
- }
- set
- {
- State["patientMedicalCase"] = value;
- }
- }
- //在其他的类中比如Controler或是View中,利用Attribute来使用State中的值
- [State("patientMedicalCase")]
- private MedicalCase patientInfo = null ;
(3)使用EventBroker(事件代理)
这个真是个好东西,让触发事件和处理事件的两个类彻底解耦——两个类之间根本就不需要知道对方的存在。同时也为我们框架提供了很好的思路,并引入了这种机制,让结构变得更加优雅。EventBroker使用的方法如下:
- //在A类中定义事件,和它的Key“topic://SmartClient/Status1Update”,后面再指定一下事件的广播范围
- [EventPublication("topic://SmartClient/Status1Update", EventScope.Global)]
- public event EventHandler<DataEventArgs<string>> UpdateStatusTextEvent;
- //在B类中处理事件
- [EventSubscription("topic://SmartClient/Status1Update", EventScope.Global, Thread = ThreadOption.UserInterface)]
- public void OnStatusUpdate(object sender, DataEventArgs<string> e)
- {
- toolStripStatusLabel1.Text = e.Data;
- }
(4)WorkItem嵌套
在CAB中一个WorkItem和一个用例对应,用例就相当一个类,一个用例发生一次,就会实例化一次用例(实例化一次WorkItem).所以会出现一个workItem中会有许多子WorkItem(子用例),这样可以提高界面的响应速度,当然也需要在必要的事情清理掉短时间内不会再用刀到的WorkItem。以免内存占用过多。
文章来源:http://www.agilelabs.cn/blogs/wind_tower/archive/2006/01/11/507.aspx