2011-02-10 48 views
1

我正在使用Poco生成器和EF4,我想知道是否可以編輯T4模板來強制所有實體類實現自定義界面。由於每次運行自定義工具時,pocos都會被刪除並重新創建,所以每次更新時都必須添加 - 我確定要避免這種情況。編輯T4 poco模板以實現定製界面

我意識到我可以爲每個poco創建部分類並在那裏實現接口,但是我希望避免所有這些樣板代碼。

任何建議將受到歡迎。

我想我正在接近一個解決方案。通過將實現添加到生成的簽名來編輯tt模板。

<#= Accessibility.ForType(實體)#> <#= code.SpaceAfter(code.AbstractOption(實體))#>部分類<#= code.Escape(實體)#>:IEntity <#=代碼.StringBefore(「,」,code.Escape(entity.BaseType))#>

但是我碰到了一些障礙。我的一些實體具有在edmx設計中指定的基類(表繼承)。我需要強制所有實體實現一個名爲IEntity的接口。 IEntity合同沒有方法,所以沒有什麼可實施的。我需要依靠所有具有共同基礎的實體。這是由於完全獨立的自定義驗證框架的實現。我爲大多數實體獲得了正確的簽名,但是,已經擁有基類的實體拋出搖擺不定,因爲在繼承基類之前無法實現接口。 :IEntity,BaseClass是不允許的。我需要交換這些,但我不知道我將如何在模板中關閉它。

回答

0

將T4模板添加到您的應用程序後,它將成爲您的應用程序的一部分,並與應用程序的其他任何部分一樣,您可以隨心所欲地執行任何操作。如果由於某種原因,你不想修改VS添加的模板,複製它並更新它只包含接口實現。第二種方式會產生另一組部分文件,並實現自定義界面。

2

在仔細閱讀T4模板使用的CodeGenerationTools類中的代碼(在包含文件EF.Utility.CS.ttinclude中找到)時,我遇到了此函數StringAfter(string value, string append)。因此,答案很簡單,因爲你的國家,所有的實體必須實現IEntity,下面應該做的伎倆:

<#=Accessibility.ForType(entity)#> <#=code.SpaceAfter(code.AbstractOption(entity))#>partial class <#=code.Escape(entity)#> : <#=code.StringAfter(code.Escape(entity.BaseType), ",")#> IEntity 

其實,我知道它,因爲我已經測試過它:-)

0

不知道這是否接近你所需要的,但...... 我已經創建了一個Nuget包,支持T4模板的層。 所有接口都有默認模板(Repository Pattern和UnitOfWork),但您可以自己編輯這些模板並重新構建您的系統。

要儘量簡短。你只需要安裝包(安裝,包裝CodePlanner),然後定義你的DomainModel ..然後運行「腳手架CodePlanner.ScaffoldAll」

其開源(codeplanner.codeplex.com )

演示:http://average-uffe.blogspot.com/2011/11/codeplanner-011-released-on-nuget-and.html

編輯:codeplanner包是專爲MVC3!

Regards Uffe