2011-02-10 19 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