Редактирование шаблона poco T4 для реализации пользовательского интерфейса

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

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

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

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

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

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


person Jay Stulo    schedule 10.02.2011    source источник


Ответы (3)


При просмотре кода в классе 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

На самом деле, я знаю, что это так, потому что я проверил это :-)

person Mark_Gibson    schedule 28.11.2011

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

person amit_g    schedule 10.02.2011

Не знаю, близко ли это к тому, что вам нужно, но... Я создал пакет Nuget, который формирует уровни из шаблонов T4. Существуют шаблоны по умолчанию для всех интерфейсов (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!

С уважением Уффе

person Uffe    schedule 28.11.2011