您的位置:首页 > 运维架构

Smart Client Software Factory :使用 Visualizer 监控 SCSF 运行状态

2008-06-20 15:03 597 查看
应网友要求提前介绍 Smart Client Software Factory 中的 Visualizer 的使用及自定义。

一、Smart Client Software Factory 中的 Visualizer 机制简介

Smart Client Software Factory 构建的客户端应用耦合松散,带来的问题是过于动态,我们很难通过简单的阅读源代码来把握 SCSF 应用的运行时状态,例如当前已经创建了哪些 WorkItem,WorkItem 里有注册了哪些 Services 和 Commands,WorkItem 的运行时层次结构是个什么样子。

想来 SCSF 团队应该也注意到了这个问题,因此引入了 Visualizer 工具来帮助我们很容易的看到 SCSF 应用运行时的具体状态。本文使用了 Codeplex 上的 CABWorkItemVisualizations 。

看看效果:

<configuration>

2 <configSections>

3 <section name="CompositeUI" type="Microsoft.Practices.CompositeUI.Configuration.SettingsSection, Microsoft.Practices.CompositeUI" allowExeDefinition="MachineToLocalUser" />

4 </configSections>

5 <CompositeUI>

6 <visualizer>

7 <add type="CABWorkItemVisualizations.FormVisualizer, CABWorkItemVisualizations" /> <!-- 直接使用 CABWorkItemVisualizations 提供的 dll -->

8 </visualizer>

9 </CompositeUI>

</configuration>

值得注意的是,如果使用源代码(引入项目的方式),配置中 type 应该是 “CABWorkItemVisualizations.WorkItemVisualization

<CompositeUI>

<visualizer>

<add type="CABWorkItemVisualizations.WorkItemVisualization, CABWorkItemVisualizations" /> <!-- 使用 CABWorkItemVisualizations 源代码 -->

</visualizer>

</CompositeUI>

如果一切正常,上面看到的 CAB Visualizer 就可以出现了。

三、研究 Smart Client Software Factory 中 Visualizer 的工作原理,创建自定义 Visualizer

使用 Visualizer 很简单,不需要知道它的具体工作原理,如果希望深入研究或者希望创建自定义 Visualizer,请继续阅读。

Visualizer 在 SCSF 框架启动过程中创建(具体在 CabShell 的 Run 方法中创建):

// CabApplication 的 Run 方法中

IVisualizer visualizer = CreateVisualizer();

CreateVisualizer 利用 VisualizerType (protected 属性)类型通过反射创建具体的 Visualizer ,是一个模板方法。

VisualizerType 属性在 WindowsFormsApplication (CabApplication 的子类)中指定为 WinFormsVisualizer

// WindowsFormsApplication 在构造函数中设置了 VisualizerType ,供 CreateVisualizer() 使用

protected WindowsFormsApplication()

// CabApplication 的 Run 方法中

if (visualizer != null)

visualizer.Initialize(rootWorkItem, builder);

CabVisualizer 的初始化过程如下:

//CabVisualizer 中

public void Initialize(WorkItem cabRootWorkItem, Builder cabBuilder)

//WinFormsVisualizer 中,创建 Visualizer 主窗体,这里是 VisualizerForm

protected override sealed void CreateVisualizationShell()

//CabVisualizer 中

private void LoadVisualizerPlugins()

// WorkItemVisualization 是一个可以承载在 Form (或 WPF)中的用户控件

public partial class WorkItemVisualization : UserControl

1// WorkItemVisualization 的注入式构造函数,上面的 AddNewVisualization 中使用

2[InjectionConstructor]

3public WorkItemVisualization( IVisualizer visualizer, WorkItem workItem ) : this()

4{

5 this.visualizer = visualizer;

6 this.cabWorkItem = visualizer.CabRootWorkItem;

7 this.thisWorkItem = workItem;

8 Monitor m = new Monitor();

9

this.cabWorkItem.State[ "ListViewMonitor" ] = m.ListViewMonitor;

workItemTree.Nodes.Clear();

AddRootWorkItem();

workItem.Workspaces[ "MainWorkspace" ].Show( m, new TabSmartPartInfo { ActivateTab = true, Title = "Monitor", Position = TabPosition.Beginning } );

workItem.Workspaces[ "MainWorkspace" ].Show( new About(), new TabSmartPartInfo { Title = "About", Position = TabPosition.End, ActivateTab = false } );

workItem.Workspaces[ "MainWorkspace" ].Show( this, new TabSmartPartInfo { ActivateTab = true, Title = "WorkItem Visualization", Position = TabPosition.Beginning } );

}

最后三行,我们看到,自定义的 Visualizer 中通过传入的 Root WorkItem 将可显示的监控界面注入到 SCSF 中的 VisualizerForm 中,通过的就是 "MainWorkspace" 名字建立起来的联系。

FLYabroad】 SCSF 通过模板方法模式结合 ObjectBuilder 提供的依赖注入为我们提供了插件式的 Visualizer 开发接口。SCSF 为我们创建了 Visualizer 主窗体(VisualizerForm), 并通过依赖注入方式将 SCSF 应用的当前 RootWorkItem 实例传入自定义 Visualizer 插件,因此可以在自定义的 Visualizer 中获得我们需要的主应用(并监控应用)的 Workspaces,SmartParts,Services,子 WorkItems,Commands 等用于监控。这也侧面反映了依赖注入的实用价值。

下载与参考:

http://www.codeplex.com/WorkItemVisualizer

http://www.codeplex.com/scsfcontrib
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: