深入IWizard接口(下)

从“项目模板参数化(下)“开始到现在,我们应用IWizard接口的都是WebClient这个子项目,实际情况是,我们怎么对每个项目做定制,或者换个角度,我们这里有三个模板元数据文件,每个都可以定义和配置WizardExtension这个节点。

一,用LifeCycleTracerIWizard跟踪多项目模板的多个子项目

重新配置3个模板元数据文件的WizardExtension节点如下(先不配置ChainingLifeCycleTracerIWizard): 

<WizardExtension>
  <Assembly>Ethan.Woo.TemplateWizard, Version=1.0.0.0, Culture=neutral, PublicKeyToken=e82b5e824e88ddd5</Assembly>
  <FullClassName>Ethan.Woo.TemplateWizard.LifeCycleTracerIWizard</FullClassName>
</WizardExtension>

 

clip_image001

这样的结果能看出什么规律么?有规律!请看我的分析:

1)蓝色部分是Solution级别的跟踪,即根项目元数据文件所配置的WizardExtension的作用范围。它的执行过程为RunStarted->ProjectFinishedGenerating->RunFinished三步,ShouldAddProjectItem没执行,因为它只包括子项目,不直接包括源文件。

2)绿色和黄色部分分别是WebClient和DataService这两个项目模板实例化过程中创建的IWizard实例的跟踪。跟踪结果和上一篇完全一样。

3)根项目元数据文件配置指定的IWizard接口方法的执行,被子项目的IWizard的生命周期在执行序列上隔开了,而且RunStarted这个方法的第三个参数的枚举值是我们上篇文章里的WizardRunKind.AsMultiProject,表明当前执行的是多个项目的模板实例化。注意,实际上这里配置的三处都用到了Ethan.Woo.TemplateWizard.LifeCycleTracerIWizard,但是实例化出来的是三个单独的实例,它们都是IWizard的实例,从某种意义上来说,根项目元数据文件所对应的的IWizard接口实现的生命周期期限,才是最长的。

这里我给出我自己的一个总结的图示,很直观的表述了之前的结果:

clip_image002

二,将ChainingLifeCycleTracerIWizard也串联过来

我们看看ChainingLifeCycleTracerIWizard串联到3个模板元数据文件的结果,很简单了吧,不多做解释了。

clip_image003

三,IWizard与Visual Studio的自动化。

注意到RunStarted方法的第一个参数是一个Object对象,其实对于Visual Studio 2010这个寄主而言,它实际上的对象类型是DTE2类型,利用这个模型,我们可以操作Visual Studio这个强大的IDE,完成复杂的逻辑操作,这里不展开讨论这个话题,仅提供两个MSDN的相关链接:

Extending the Visual Studio Environment:http://msdn.microsoft.com/zh-cn/library/esk3eey8.aspx 
Automation and Extensibility Reference:
http://msdn.microsoft.com/zh-cn/library/1xt0ezx9.aspx

好了,对IWizard这个接口的深入讨论,就到这个地方,在这个基础上,我们可以根据我们的需要,定制我们自己的实现,甚至可以定制出一整套使用的框架,专门用于建立我们的复杂项目模板。当然了,最复杂的项目模板实际上我们把它叫做Starter Kits(初学者工具包),它是普通项目模板的增强版,下文会继续介绍。

 

摘自:http://www.ethan-woo.com/post/2011/05/03/Deep-into-IWizard-Second.aspx

posted @ 2011-12-15 17:24  WarrenHu  阅读(568)  评论(0编辑  收藏  举报