4

我一直在編寫一個程序集來簡化我的大部分POCO類型代。我有一個核心程序集,其中包含多個tt文件並用於生成代碼。爲什麼使用ttinclude而不是編譯程序集?

我之所以這樣做是因爲無論我嘗試使用哪種擴展(Devart T4,Tangible-T4或Visual T4),都不如Visual Studio C#編輯器提供的智能感知和支持,所以編寫代碼生成在純粹的C#中改進了很多經驗。

我面臨的最大問題是實體框架助手類(例如Accessibility,CodeGenerationTools,MetadataTools等)在ttinclude文件中定義而不是程序集;目前我不得不重寫很多這些類提供的功能,以便它可以在程序集中使用。

我的問題是,爲什麼實體框架團隊決定使用ttinclude文件而不是一些編譯程序集?使用組件方法似乎在更多情況下會更加可用,並且仍然不會影響T4代碼生成(而不是使用<#@ include #>它將是<#@ assembly #>)。

我想知道什麼是最好的方法來解決這個問題,我已經打算運行EF.Utility.CS.ttincludeTextTransform.exe,然後採取生成的C#和編譯這,這將是明智的?

感謝,盧克

更新

目前我所做的就是添加EF.Utility.CS.ttinclude到我的項目,對文件設置自定義工具TextTemplatingFilePreprocessor。這將生成包含類的代碼。然後我複製了這個cs文件,刪除了負責寫入輸出的類(它有方法TransformText())並編譯成一個程序集。我現在可以在我的程序集中使用實體框架實用程序類。

回答

2

使用ttinclude而不是程序集的原因與使用T4代替自定義工具來生成類(這是您實際正在做的事以及以前使用的大多數設計器)相同。 T4和ttinclude可以更改。您可以複製ttinclude並創建小的更改,並將其包含在每個項目基本的主要T4中。

Btw。你知道有成千上萬的程序員可以在沒有任何智能感知的情況下編寫代碼;)對智能感知的更大支持並不是放棄使用T4模板的理由。

+2

我從來沒有說過我不能在沒有智能感知的情況下編寫代碼,但我確實瞭解intellisense(以及代碼重構,參考等)所提供的好處。我仍然部分使用T4模板,我的程序集定義了從TextTransformation派生的類。不得不根據情況更改ttinclude文件表明,如果我們開始複製和更改每種情況下的代碼,就像說多態不存在一樣,那麼包含的類沒有設計或實現得不夠好。 – Lukazoid

+0

在一個ttinclude文件中有很多類似乎違背了.NET每個文件一個類的哲學,如果我們將每個類拆分成它自己的ttinclude文件,那麼我們有很多'<#@ include#>'在最佳。如果試圖重新使用代碼(即必須使用相對路徑可能會變得太長,或者不得不編輯註冊表才能使其運行),這尤其糟糕。另一個問題是與包含的整個鑽石問題,FileA包括FileB和FileC,FileB和FileC都包含FileD,現在文本轉換失敗,因爲相同的類(來自FileD)被聲明兩次。 – Lukazoid

+0

我認爲使用包含共享類的程序集更加可取。 (我很抱歉,如果我似乎在咆哮,只是試圖解釋我的推理) – Lukazoid

相關問題