![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Scaffolding. Начало.
В этом и следующем уроке мы изучим то, что поможет вам в разы быстрее разрабатывать приложения. Начнем издалека. Когда я делал первый сайт, я смотрел, как можно реализовать тот или иной функционал и использовал его у себя в приложении. Потом, когда у меня появился второй проект, я начал функционал улучшать. Я выделил основные моменты и инструменты, которые были описаны в предыдущих уроках. Я начал замечать, что я делаю часто много механичной работы, например: · создать в БД новую таблицу · прокинуть ее в класс DbContext · добавить объявление в интерфейс репозитария · добавить реализацию в SqlRepository · добавить partial-часть класса в папке Proxy · добавить модель данных · объявить mapping · создать контроллер в админке · сделать типичные view для просмотра и редактирования И так как это было поистину скучно, я часто ошибался в одном из шагов – и нужно было править банальные ошибки. И я создал сниппеты, но они решали только половину задачи, а вот модель данных, контроллер, index.cshtml, edit.cshtml – это не было решено. И вот я прочитал статью Стивена Сандерсона «Scaffold your ASP.NET MVC 3 project with the MvcScaffolding package» и загорелся. Скаффолдинг подходил мне идеально, но он не был написан для моего решения. И я начал изучать. В основе его стоял T4 (Text Template Transformation Toolkit), в шаблонах используется именно этот синтаксис, но для работы дошаблонной логики используется Windows PowerShell. Собственно, с PowerShell мы работаем в PackageManager Console (ух, как закручено!). Я совсем немного погружусь в Windows PowerShell и T4, только для того, чтобы создать пару скаффолдеров для работы с проектом. Итак, что нам изначально необходимо, так это установить PowerGUI для работы с PowerShell. В VS2010 есть много редакторов для PowerShell. Но мы работаем с VS2012 и нам пока так не повезло. Ок, установили. Переходим к установке редактора для t4 - https://t4-editor.tangible-engineering.com. Тоже пока что единственный редактор для VS2012. Ну что ж – подсветочка есть и ладно.
T4 Далее изучим, что у нас есть. Начнем с T4. Я пользовался этой ссылкой: https://www.olegsych.com/2007/12/text-template-transformation-toolkit/ Создадим новый проект, библиотеку классов LesssonProject.T4. И добавим туда HelloWorld.tt: Изменим немного: < #@ output extension=".cs" #> < #@ Assembly Name=" System.Core" #> < #@ Assembly Name=" System.Windows.Forms" #> < #@ import namespace=" System" #> < #@ import namespace=" System.IO" #> < #@ import namespace=" System.Diagnostics" #> < #@ import namespace=" System.Linq" #> < #@ import namespace=" System.Collections" #> < #@ import namespace=" System.Collections.Generic" #> < # var greeting = " Hello, World! "; #> // This is the output code from your template // you only get syntax-highlighting here - not intellisense namespace MyNameSpace { class MyGeneratedClass { static void main (string[] args) { System.Console.WriteLine(" < #= greeting #> "); } } }
< #+ // Insert any template procedures here void foo(){} #>
Ок, и результатом этого будет:
// This is the output code from your template // you only get syntax-highlighting here - not intellisense namespace MyNameSpace { class MyGeneratedClass { static void main (string[] args) { System.Console.WriteLine(" Hello, World! "); } } }
На самом деле.tt файл преобразуется в код, который создает конкретный класс, наследуемый от TextTransformation. Этот код запускается и генерируется файл-результат. Выглядит примерно так:
< #@ template language=" C#" #> Hello World!
Преобразуется в: public class GeneratedTextTransform: Microsoft.VisualStudio.TextTemplating.TextTransformation { public override string TransformText() { this.Write(" Hello, World! "); return this.GenerationEnvironment.ToString(); } }
А итогом будет файл.cs: Hello World!
Изучим блоки и синтаксис задания шаблонов, который очень похож на aspx, только вместо скобок < % %> используется < # #>. Но, так как aspx мы не изучали, то: · Текстовый блок – это любой не программный текст в тексте шаблона (извините за тафтологию): < #@ template language=" C#" #> Hello World! · Блок операторов – это любой блок, заключенный в < # #>. Всё что внутри этого, это языковая конструкция, которая задает логику построения текста: < # var greeting = " Hello, World! "; #> · Блок выражения – это блок, заключенный в < #= #>. Всё, что внутри этого блока, будет приведено к строке и добавлено в текст шаблона: System.Console.WriteLine(" < #= greeting #> "); · Блок функций – это блок, заключенный в < #+ #>. Все функции, объявленные в этом блоке, могут быть вызваны в шаблоне. Кроме того, сами функции могут содержать текст шаблона. · Директива < #@ template #> – позволяет задать характеристики класса преобразования из шаблона: o < #@ template language=”C#”> – задает язык класса. o < #@ template debug=”true”> – позволяет отладить генерацию шаблона. o < #@ template inherits=”MyTextTransformation”> – указывает, какой класс должен быть использован в качестве базового для класса генерации в процедуре генерации файла. · Директива < #@ output #> – задает расширение для генерируемого файла: < #@ output extension=".cs" #> · Директива < #@ import #> – добавляет использование в процедуре исполнения заданных namespace. То же самое что и using добавить (но не в результат, а при выполнении генерации текста): < #@ import namespace=" System.Collections" #> · Директива < #@ assembly #> – добавляет объявление сборки. То же самое, что и в VisualStudio добавить Reference: < #@ Assembly Name=" System.Core" #> · Директива < #@ include #> – добавляет некий другой шаблон в месте объявления. Это как @Html.Partial(): < #@ include file=" Included.tt" #> · Директива < #@ parameter #> - добавляет параметр при формировании шаблона. Но передача его происходит настолько сложно, что пример я приводить не буду. Ссылка · По остальному – смотрите по ссылке.
В общем, этих знаний и знаний по Reflection вполне хватит, чтобы сгенерировать нужные нам файлы, но перейдем к проекту MvcScaffolding.
|