编辑T4 poco模板以实现自定义界面

时间:2011-02-10 16:37:22

标签: templates interface entity-framework-4 poco t4

我正在使用带有EF4的Poco生成器,我想知道是否可以编辑T4模板以强制我的所有实体类实现自定义界面。由于每次运行自定义工具时pocos都会被吹走并重新创建,我必须在每次更新时添加它 - 我当然希望避免这种情况。

我意识到我可以为每个poco创建部分类并在那里实现接口,但我希望避免使用所有样板代码。

欢迎任何建议。

我想我越来越接近解决方案了。我正在通过将实现添加到生成的签名来编辑tt模板。

<#= Accessibility.ForType(实体)#> <#= code.SpaceAfter(code.AbstractOption(entity))#> partial class<#= code.Escape(entity)#> :IEntity<#= code.StringBefore(“,”,code.Escape(entity.BaseType))#>

但是我遇到了一些障碍。我的一些实体有我在edmx设计中指定的基类(表继承)。我需要强制所有实体实现一个名为IEntity的接口。 IEntity合同没有方法,所以没有什么可以实现的。我需要依赖所有具有共同基础的实体。这是由于自定义验证框架的完全独立实现。我获得了大多数实体的正确签名,但是,已经拥有基类的实体会因为在继承基类之前无法实现接口而导致抖动。 :IEntity,不允许使用BaseClass。我需要交换这些,但我不确定如何在模板中取消它。

3 个答案:

答案 0 :(得分: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

事实上,我知道这样做是因为我已经测试了它: - )

答案 1 :(得分:0)

将T4模板添加到您的应用程序后,它将成为您应用程序的一部分,并且与应用程序的任何其他部分一样,您可以随意使用它。如果由于某种原因,您不想修改VS添加的模板,请复制它并更新它以仅包括接口实现。第二种方法是生成另一组部分文件,并实现自定义接口。

答案 2 :(得分:0)

不知道这是否接近你所需要的...... 我已经创建了一个Nuget包,它来自T4-templates的脚手架层。 所有接口都有默认模板(Repository Pattern和UnitOfWork),但您可以自己编辑这些模板并重新构建系统。

要保持简短..你只需安装软件包(Install-Package CodePlanner)然后定义你的域模型..然后运行“Scaffold CodePlanner.ScaffoldAll”

其开源(codeplanner.codeplex.com)

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

编辑:codeplanner包是为MVC3构建的!

此致 Uffe