Редактирование шаблона T4 Poco для реализации пользовательского интерфейса - PullRequest
1 голос
/ 10 февраля 2011

Я использую генератор Poco с EF4, и мне интересно, можно ли отредактировать шаблон T4, чтобы заставить все мои классы сущностей реализовать собственный интерфейс. Поскольку pocos сдувается и воссоздается каждый раз, когда запускается пользовательский инструмент, мне придется добавлять это при каждом обновлении - я бы очень хотел этого избежать.

Я понимаю, что мог бы создать частичные классы для каждого poco и реализовать там интерфейс, но я надеялся избежать всего этого стандартного кода.

Любые предложения приветствуются.

Я думаю, что все ближе к решению. Я редактирую шаблон tt, добавляя реализацию к сгенерированной подписи.

<# = Accessibility.ForType (entity) #> <# = code.SpaceAfter (code.AbstractOption (entity)) #> частичный класс <# = code.Escape (entity) #>: IEntity <# = code. StringBefore (",", code.Escape (entity.BaseType)) #>

Но я наткнулся на небольшую загадку. Некоторые из моих сущностей имеют базовые классы (наследование таблиц), которые я обозначил в проекте edmx. Мне нужно заставить все сущности реализовать интерфейс под названием IEntity. Контракт IEntity не имеет методов, поэтому на самом деле ничего не нужно реализовывать. Мне нужно будет полагаться на все сущности, имеющие общую базу. Это связано с совершенно отдельной реализацией пользовательской среды валидации. Я получаю надлежащие подписи для большинства сущностей, однако сущности, у которых уже есть базовый класс, вызывают колебания, потому что вы не можете реализовать интерфейс до того, как унаследуете базовый класс. : IEntity, BaseClass не допускается. Мне нужно поменять их местами, но я не уверен, как мне это сделать в шаблоне.

Ответы [ 3 ]

2 голосов
/ 28 ноября 2011

При просмотре кода в классе CodeGenerationTools, который использует шаблон T4 (находится во включаемом файле 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 голосов
/ 28 ноября 2011

Не знаю, если это близко к тому, что вам нужно, но .... Я создал пакет Nuget, поддерживающий уровни из T4-шаблонов. Существуют шаблоны по умолчанию для всех интерфейсов (Repository Pattern и UnitOfWork), но вы можете отредактировать эти шаблоны самостоятельно и заново подготовить свою систему.

Короче говоря ... Вы просто устанавливаете пакет (Install-Package CodePlanner), а затем определяете свою модель домена .. И затем запускаете "Scaffold CodePlanner.ScaffoldAll"

Его открытый исходный код (codeplanner.codeplex.com)

Демо: http://average -uffe.blogspot.com / 2011/11 / codeplanner-011-release-on-nuget-and.html

Редактировать: пакет codeplanner построен для MVC3!

С уважением Uffe

0 голосов
/ 10 февраля 2011

После добавления шаблона T4 в ваше приложение он становится частью вашего приложения и, как и любая другая часть приложения, вы можете делать с ним все, что захотите.Если по какой-либо причине вы не хотите изменять добавленный шаблон VS, сделайте его копию и обновите его, чтобы включить только реализацию интерфейса.Второй способ - создание другого набора частичных файлов с внедряемым пользовательским интерфейсом.

...