從“項目模板參數化(下)“開始到現在,我們應用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>
這樣的結果能看出什麼規律嗎?有規律!請看我的分析:
1)藍色部分是Solution層級的跟蹤,即根項目中繼資料檔案所配置的WizardExtension的作用範圍。它的執行過程為RunStarted->ProjectFinishedGenerating->RunFinished三步,ShouldAddProjectItem沒執行,因為它只包括子項目,不直接包括源檔案。
2)綠色和黃色部分分別是WebClient和DataService這兩個項目模板執行個體化過程中建立的IWizard執行個體的跟蹤。跟蹤結果和上一篇完全一樣。
3)根項目中繼資料檔案配置指定的IWizard介面方法的執行,被子項目的IWizard的生命週期在執行序列上隔開了,而且RunStarted這個方法的第三個參數的枚舉值是我們上篇文章裡的WizardRunKind.AsMultiProject,表明當前執行的是多重專案的模板執行個體化。注意,實際上這裡配置的三處都用到了Ethan.Woo.TemplateWizard.LifeCycleTracerIWizard,但是執行個體化出來的是三個單獨的執行個體,它們都是IWizard的執行個體,從某種意義上來說,根項目中繼資料檔案所對應的的IWizard介面實現的生命週期期限,才是最長的。
這裡我給出我自己的一個總結的圖示,很直觀的表述了之前的結果:
二,將ChainingLifeCycleTracerIWizard也串聯過來
我們看看ChainingLifeCycleTracerIWizard串聯到3個模板中繼資料檔案的結果,很簡單了吧,不多做解釋了。
三,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