目錄html
0.引言前端
2.IWizad接口github
3.經過Visual Studio擴展開發實現領域驅動開發web
3.1 使用VSIX+ProjectTemplate建立項目模板安全
4.結語app
最近一直在學習博客【老張的哲學】的.NET Core2.0 Api + Vue 2.0的系列文章,經過邊看邊本身動手實踐,本身對一些概念有了更深刻的理解(如依賴注入、前端的一些知識、VUE框架),原本也計劃好經過該系列文章好好學習一下VUE框架並應用到實際的項目中的,特此還重點突擊了一個星期左右,但最後發現自身功力不夠(畢業3年都沒有敲過代碼,加之以前只是作過一些win form的簡單開發,Web知識仍是比較欠缺的,因爲工做的須要今年才從新撿起來),因此是後仍是放棄了。哈哈,扯遠了......下面開始進入正題框架
在【老張的哲學】的系列教程第32篇博文中博主主要介紹了快速實現項目的半自動化搭建的四種方式:動軟代碼生成器、VSTO、T4模板、SqlSuagr等,按個人理解我以爲這幾種方式,無非就是事先定義好一些模板,而後按各自的方法生成相應的文件(好像這句話等於沒有說,哈哈.....),這幾種方式確實在實際的工做中能夠減小不少重複性的工做,並且本身經過這大半年的開發工做中,也深有感觸是頗有必要找到一種適合的方式來減小這些沒必要要的工做量(不瞞你們說,也不怕你們笑話,最近的項目開發中的CRUD真的是我本身一行一行敲出來的),今天的話主要在博主的基礎上在介紹另一種方式:VSIX插件+ItemTemplate+ProjectTemplate來實現一樣的目的,這裏的話主要是介紹基礎的,後面在根據項目的須要完善。本人也沒有寫過技術博客,若是寫得很差或有誤,請你們多多包含和批評指正。
說了那麼多,你們可能仍是比較蒙圈(也多是我沒有解釋清楚),直接來3張圖(以下所示),在日常的開發過程當中,你們確定常常經過在項目中右鍵建立類、接口、Windows窗體、用戶控件等,其實這些就是Visual Studio自身提供的一些模板,如新建一個Windows窗體後,窗體的大小、顏色、顯示的名稱都已經定義好了,不須要用戶在敲一大堆代碼才能把這個窗體顯示出來,本文就是經過這種方式快速實現項目的半自動化搭建。
【新建項】
【新建Windows窗體】
【Form1】
在開始操做前,首先說說「IWizard」接口:
Visual Stdudio提供了IWizard接口,該接口提供了幾個方法幫助用戶在建立模板項時可運行自定義的代碼,見下表,本文就是經過這個接口實現的。
Name | Description | |
---|---|---|
BeforeOpeningFile(ProjectItem) | Runs custom wizard logic before opening an item in the template. |
|
ProjectFinishedGenerating(Project) | Runs custom wizard logic when a project has finished generating. |
|
ProjectItemFinishedGenerating(ProjectItem) | Runs custom wizard logic when a project item has finished generating. |
|
RunFinished() | Runs custom wizard logic when the wizard has completed all tasks. |
|
RunStarted(Object, Dictionary<String, String>, WizardRunKind, Object[]) | Runs custom wizard logic at the beginning of a template wizard run. |
|
ShouldAddProjectItem(String) | Indicates whether the specified project item should be added to the project. |
什麼是領域驅動開發,哈哈......有興趣的能夠去深刻了解一下,之因此提起這個概念,主要是最近在Github上了解到ABP這個開源項目,目前start的人數多達5.5k,網址asp.net boilerplate,這個框架比較好的實現了領域驅動開發這個概念(聽說也不是徹底符合領域驅動設計的概念,具體的話還須要本身深刻了解學習),自我認爲這是個比較好的學習框架,裏面涉及到比較多新的技術和知識(對於我來講基本上是新知識),你們有時間能夠抽空看看,後期我也計劃把該框架應用到實際的項目中去,哈哈......又扯遠了。
下面正式進入正題:
1.建立項目模板,命名爲FirstProjectTemplate。並打開該項目下的Class1.cs文件,隨意輸入一些註釋,有啥用?請耐心等待。
備註:若是沒有Extensibility這個分類,請在更新與擴展裏安裝。
2.添加新的VSIX項目,命名爲FirstProjectWizard,並把該項目設置爲啓動項目。
3.在FirstProjectWizard項目中雙擊打開source.extension.vsixmaifest文件,填寫Product Name、Author、Version、Desription等基本信息。
4.在3打開的文件中,在左側欄中切換到Assets選項卡,單擊【New】新建一個Asset(中文不知道翻譯成啥好,哈哈...),Type選擇Microsoft.VisualStudio.ProjectTemplate,Source選擇A Project in current solution,Project選擇FirstProjectTemplate,其它設置見圖。
5.按F5 生成解決方案並啓動調試,將打開另外一個Visual Studio實例(這可能須要幾分鐘的時間,電腦配置好點估計秒開...),仔細的估計會注意到Visual Studio窗口多了【實驗實例】幾個字,這個具體拿來幹啥的,有興趣的能夠百度一下,哈哈...
6.在剛剛打開的Visual Sdudio窗口新建一個項目,彈出的【新建項目】窗口,在右上角輸入first,選中FirstProjectTemplate,單擊肯定。
7.打開剛新建項目中的Class1.cs,哦哦...剛在1步驟中註釋的語句出現了,是否是嚐到了勝利的味道。或許說到這裏,你們已經大概瞭解到思路了,恭喜你離成功更靠近一步了....加油,請給點耐心喲。
本節主要介紹經過自定義一些參數,實如今添加項時項模板能按要求輸出,好了...話很少說,直接演示。
1.在3.1建立的解決方案中,新建一個項項目(ItemTemplate),命名FirstItemTemplate。
2.選中3.1中建立的FirstProjectWizard項目,按F4彈出屬性窗口,設置如圖三個屬性字段爲ture。
3.將FirstProjectWizard、FirstItemTemplate做爲Asset添加到VSIX項目中。雙擊打開source.extension.vsixmanifest 文件,並切換到Asset窗口中,相關設置見下圖。
【添加FirstProjectWizard】
【添加後的Asset】
4.添加VSIX開發要用到的相關類庫。在FirstProjectWizard項目下的引用鼠標右鍵,添加
EnvDTE、Microsoft.VisualStudio.TemplateWizardInterface、System.Drawing、System.Windows、System.Windows.Forms等。
5.在FirstProjectWizard項目中添加類,並命名爲WizardImplementation,並繼承IWizard接口,具體代碼以下:
6.在FirstProjectWizard項目中添加Windows窗體,命名爲CustomFieldForm,具體代碼以下:
7.添加程序集簽名。選中FirstProjectWizard項目,右鍵單擊,選中項目屬性,切換到簽名欄,勾選爲程序集簽名,輸入祕鑰文件名稱key.snk,去掉勾選使用密碼保護祕鑰文件,相關設置見下圖。
8.選中FirstProjectWizard項目,按F4彈出屬性窗口,設置複製生成輸出到輸出目錄字段true,並從新生成解決方案。
9.將剛生成的key.snk祕鑰文件拷貝到C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools目錄下,運行cmd(須要管理員身份運行),並cd到C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools該目錄下,輸入:
10.從key.snk中獲取公鑰,在命令窗口輸入,如圖 並記下該公鑰。
11.將對自定義嚮導的引用添加到項目模板的.vstemplate 文件。分別找到FirstItemTemplate、FirstProjectTemplate項目中的兩個vstemplate文件,在<TemplateContent>節點後面添加以下代碼,最終如圖。
12.保存全部文件,並從新生成解決方案。按F5運行,打開剛剛建立的FirstProjectTemplate1項目,右鍵添加新項,彈出【添加新項】窗口,在右上角搜索first,哈哈...FirstItemTemplate出現啦...成功八九十
好啦,經過3.一、3.2的介紹基本的框架已經搭建起來啦,下面就在ABP架構的基礎上實現經過可視化添加實體,快速自動生成領域驅動設計各層的部分文件,注意只是部分哈,不要糾結是否符合領域驅動設計。
在開始前,首先介紹一下【模板參數】,見下表,replacementsDictionary共有23個系統自帶的參數,經過鍵值(Dictionary)保存,固然用戶能夠經過自定義參數添加到字典中,具體有什麼做用,請見後文。
參數 | 描述 |
---|---|
clrversion |
公共語言運行時 (CLR) 的當前版本。 |
GUID [1-10] |
一個用於替換項目文件中的項目 GUID 的 GUID。 可指定最多 10 個惟一的 GUID(例如,guid1) 。 |
itemname |
「添加新項」對話框中由用戶提供的名稱。 |
machinename |
當前的計算機名稱(例如,Computer01)。 |
projectname |
「新建項目」對話框中由用戶提供的名稱。 |
registeredorganization |
來自 HKLM\Software\Microsoft\Windows NT\CurrentVersion\RegisteredOrganization 的註冊表項值。 |
rootnamespace |
當前項目的根命名空間。 此參數僅適用於項模板。 |
safeitemname |
用戶在「添加新項」對話框中提供的名稱,名稱中移除了全部的不安全字符和空格。 |
safeprojectname |
用戶在「新建項目」對話框中提供的名稱,名稱中移除了全部的不安全字符和空格。 |
time |
以 DD/MM/YYYY 00:00:00 格式表示的當前時間。 |
SpecificSolutionName |
解決方案的名稱。 在選中「建立解決方案目錄」時,SpecificSolutionName 具備解決方案名稱。 在未選中「建立解決方案目錄」時,SpecificSolutionName 爲空。 |
userdomain |
當前的用戶域。 |
username |
當前的用戶名稱。 |
webnamespace |
當前網站的名稱。 此參數在 Web 窗體模板中用於保證類名是惟一的。 若是網站在 Web 服務器的根目錄下,則此模板參數會解析爲 Web 服務器的根目錄。 |
year |
以 YYYY 格式表示的當前年份。 |
1.在FirstItemTemplate項目中,雙擊打開vstemplate文件,找到文件自動生成的<ProjectItem>,隨後跟着添加多幾個<ProjectItem>,具體以下:
2.對照在1中添加的配置新建相應文件,如Entity.cs、IAppService.cs,最終結構見下圖。
3.利用模板參數replacementsDictionary實現自定義項模板,如Entity.cs類以下圖,其它按照本身的需求實現,思路就是用replacementsDictionary裏的值進行替換,若是你們有更好的思路,歡迎你們提出。
4.在WizardImplementation類的ProjectItemFinishedGenerating( )方法中,實現文件的放到指定的工程目錄下。PS:目前的方法比較笨,主要實現思路是先根據模板生成文件,而後Copy一份到指定的目錄,而後把源文件Delete。你們若有好的方法,請多多留言。代碼以下:
5.繼續按F5運行,打開Visual Studio【實驗實例】,新建一個解決方案,包含兩個工程,以下圖:
6.在CenterInfo.Core工程中右鍵新建項,彈出添加新項對話框,找到FirstItemTemplate,命名爲Depart。
7.彈出建立【Depart】實體對話框,這裏主要模擬建立包含Name字段的實體類,單擊肯定。
8.哇...最終生成以下圖,搞了半天就這麼點東西。
終於寫到結語了,說實話寫個技術博客真不容易(這篇博客花了2天的時間收集資料,1天的時間本身動手實踐,而後幾個小時的時間完成編寫)......在第3小節說好的【經過Visual Studio擴展開發實現領域驅動開發】,哈哈,都是騙人的,只是爲了吸引你們的眼球,好啦,坑我就挖到這裏,剩下的由你們把這個坑補完。
(後續有時間會把【經過Visual Studio擴展開發實現領域驅動開發】實現,期待着...)