Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






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:

Изменим немного:
< #@ template debug=" true" hostSpecific=" true" #>

< #@ 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.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.