我一直在編寫一個程序集來簡化我的大部分POCO類型代。我有一個核心程序集,其中包含多個tt文件並用於生成代碼。爲什麼使用ttinclude而不是編譯程序集?
我之所以這樣做是因爲無論我嘗試使用哪種擴展(Devart T4,Tangible-T4或Visual T4),都不如Visual Studio C#編輯器提供的智能感知和支持,所以編寫代碼生成在純粹的C#中改進了很多經驗。
我面臨的最大問題是實體框架助手類(例如Accessibility
,CodeGenerationTools
,MetadataTools
等)在ttinclude文件中定義而不是程序集;目前我不得不重寫很多這些類提供的功能,以便它可以在程序集中使用。
我的問題是,爲什麼實體框架團隊決定使用ttinclude文件而不是一些編譯程序集?使用組件方法似乎在更多情況下會更加可用,並且仍然不會影響T4代碼生成(而不是使用<#@ include #>
它將是<#@ assembly #>
)。
我想知道什麼是最好的方法來解決這個問題,我已經打算運行EF.Utility.CS.ttinclude
到TextTransform.exe
,然後採取生成的C#和編譯這,這將是明智的?
感謝,盧克
更新
目前我所做的就是添加EF.Utility.CS.ttinclude
到我的項目,對文件設置自定義工具TextTemplatingFilePreprocessor
。這將生成包含類的代碼。然後我複製了這個cs文件,刪除了負責寫入輸出的類(它有方法TransformText()
)並編譯成一個程序集。我現在可以在我的程序集中使用實體框架實用程序類。
我從來沒有說過我不能在沒有智能感知的情況下編寫代碼,但我確實瞭解intellisense(以及代碼重構,參考等)所提供的好處。我仍然部分使用T4模板,我的程序集定義了從TextTransformation派生的類。不得不根據情況更改ttinclude文件表明,如果我們開始複製和更改每種情況下的代碼,就像說多態不存在一樣,那麼包含的類沒有設計或實現得不夠好。 – Lukazoid
在一個ttinclude文件中有很多類似乎違背了.NET每個文件一個類的哲學,如果我們將每個類拆分成它自己的ttinclude文件,那麼我們有很多'<#@ include#>'在最佳。如果試圖重新使用代碼(即必須使用相對路徑可能會變得太長,或者不得不編輯註冊表才能使其運行),這尤其糟糕。另一個問題是與包含的整個鑽石問題,FileA包括FileB和FileC,FileB和FileC都包含FileD,現在文本轉換失敗,因爲相同的類(來自FileD)被聲明兩次。 – Lukazoid
我認爲使用包含共享類的程序集更加可取。 (我很抱歉,如果我似乎在咆哮,只是試圖解釋我的推理) – Lukazoid