ASP.NET MVC рдкрд╛рда рдбреАред рдордЪрд╛рди

рдкрд╛рда рдХрд╛ рдЙрджреНрджреЗрд╢реНрдпред рдПрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдордЪрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реАрдЦреЗрдВред рд╣рдо рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдФрд░ рдареАрдХ рдХрд░рддреЗ рд╣реИрдВред рдХрдХреНрд╖рд╛ рдХрд╛ рд╕рд░рд▓ рдФрд░ рднрд╛рд╖рд╛ рд╕рдВрд╕реНрдХрд░рдгред рд╣рдо рд╕реНрдХреИрдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╣рдо "рдорд╛рд░реНрдЧрджрд░реНрд╢рдХ" рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред Scaffolder рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ред рдирд┐рдпрдВрддреНрд░рдг рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рдмрдирд╛рдирд╛ред рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреИрдирд▓ рдореЗрдВ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдмрдирд╛рдиреЗ рдФрд░ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдкреВрд░рд╛ рдЪрдХреНрд░ред

Visual Studio 2013 рдХреЗ рд▓рд┐рдП рдордЪрд╛рди T4 рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реИред

рдордЪрд╛рдиред рдкреНрд░рд╛рд░рдВрднред

рдЗрд╕ рдФрд░ рдЕрдЧрд▓реЗ рдкрд╛рда рдореЗрдВ, рд╣рдо рд╕реАрдЦреЗрдВрдЧреЗ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдХрдИ рдЧреБрдирд╛ рддреЗрдЬреА рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреЗред рдЪрд▓реЛ рд╢реБрд░реВ рд╕реЗред рдЬрдм рдореИрдВрдиреЗ рдкрд╣рд▓реА рд╕рд╛рдЗрдЯ рдмрдирд╛рдИ, рддреЛ рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдПрдХ рдпрд╛ рджреВрд╕рд░реЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдлрд┐рд░, рдЬрдм рдореБрдЭреЗ рджреВрд╕рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдорд┐рд▓реА, рддреЛ рдореИрдВрдиреЗ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред рдореИрдВрдиреЗ рдкрд┐рдЫрд▓реЗ рдкрд╛рдареЛрдВ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдореБрдЦреНрдп рдмрд┐рдВрджреБрдУрдВ рдФрд░ рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рд╛ред рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдореИрдВ рдЕрдХреНрд╕рд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдпрд╛рдВрддреНрд░рд┐рдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:




рдФрд░ рдЪреВрдВрдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдмрд╛рдК рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЕрдХреНрд╕рд░ рдЪрд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдЧрд▓рддреА рдХреА - рдФрд░ рдпрд╣ рдкреНрд░рддрд┐рдмрдВрдз рд╕рдВрдмрдВрдзреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдерд╛ред рдФрд░ рдореИрдВрдиреЗ рд╕реНрдирд┐рдкреЗрдЯ рдмрдирд╛рдпрд╛, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЛрдВрдиреЗ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдХреЗрд╡рд▓ рдЖрдзрд╛ рд╣рд▓ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдбреЗрдЯрд╛ рдореЙрдбрд▓, рдирд┐рдпрдВрддреНрд░рдХ, index.cshtml, edit.cshtml - рдпрд╣ рд╣рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдФрд░ рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд╕реНрдЯреАрд╡рди рд╕реИрдВрдбрд░рд╕рди рдХреЗ рд▓реЗрдЦ " рдЕрдкрдиреЗ ASP.NET MVC 3 рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ MvcScaffolding package " рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдФрд░ рдЖрдЧ рдкрдХрдбрд╝ рд▓реАред рдордЪрд╛рди рдореБрдЭреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдХреВрд▓ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрд░реЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред рдФрд░ рдореИрдВ рдкрдврд╝рд╛рдИ рдХрд░рдиреЗ рд▓рдЧрд╛ред рдпрд╣ T4 ( рдЯреЗрдХреНрд╕реНрдЯ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдореЗрд╢рди рдЯреВрд▓рдХрд┐рдЯ ) рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдерд╛, рдЗрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░реА-рдЯреЗрдореНрдкрд▓реЗрдЯ рд▓реЙрдЬрд┐рдХ рдХреЗ рд▓рд┐рдП рд╡рд┐рдВрдбреЛрдЬ рдкреЙрд╡рд░рд╢реЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рджрд░рдЕрд╕рд▓, рд╣рдо рдкреИрдХреЗрдЬрдореЗрдиреНрдЬрд░ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдкрд╛рд╡рд░рд╢реЗрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ (рд╡рд╛рд╣, рдХреИрд╕реЗ рдореБрдбрд╝реЗрдВ!)ред рдореИрдВ рд╡рд┐рдВрдбреЛрдЬ рдкреЙрд╡рд░рд╢реЗрд▓ рдФрд░ T4 рдореЗрдВ рдереЛрдбрд╝рд╛ рдмрд╣реБрдд рдбреБрдмрдХреА рд▓рдЧрд╛рдКрдВрдЧрд╛, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рдПрдХ рдЬреЛрдбрд╝реА рдордЪрд╛рди рдмрдирд╛рдКрдВрдЧрд╛ред

рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдкрд╛рд╡рд░рд╕реНрд╡рд┐ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП PowerGUI рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред VS2010 рдореЗрдВ PowerShell рдХреЗ рд▓рд┐рдП рдХрдИ рд╕рдВрдкрд╛рджрдХ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╣рдо VS2012 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЕрднреА рддрдХ рд╣рдо рдЗрддрдиреЗ рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рдирд╣реАрдВ рд╣реИрдВред

рдареАрдХ рд╣реИ, рд╕реНрдерд╛рдкрд┐рддред рд╣рдо t4 рдХреЗ рд▓рд┐рдП рд╕рдВрдкрд╛рджрдХ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ - http://t4-editor.tangible-engineering.com ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрднреА рдХреЗ рд▓рд┐рдП, VS2012 рдХреЗ рд▓рд┐рдП рдПрдХрдорд╛рддреНрд░ рд╕рдВрдкрд╛рджрдХред рдЕрдЪреНрдЫрд╛ - рд╡рд╣рд╛рдБ рдПрдХ рдмреИрдХрд▓рд╛рдЗрдЯ рд╣реИ, рдареАрдХ рд╣реИред

рдЯреА -4

рдЕрдЧрд▓рд╛, рд╣рдо рдЕрдзреНрдпрдпрди рдХрд░реЗрдВрдЧреЗ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рд╣реИред рдЪрд▓реЛ T4 рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдЗрд╕ рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛: http://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 рдХреЗ рд╕рдорд╛рди рд╣реИ, рдХреЗрд╡рд▓ <# #> рдХреЛрд╖реНрдардХ рдХреЗ рдмрдЬрд╛рдп рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ <%%>ред рд▓реЗрдХрд┐рди, рдЬрдм рд╕реЗ рд╣рдордиреЗ рдПрд╕реНрдкрдХреНрд╕ рдХрд╛ рдЕрдзреНрдпрдпрди рдирд╣реАрдВ рдХрд┐рдпрд╛, рддрдм:


рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд░рд┐рдлреНрд▓реЗрдХреНрд╢рди рдкрд░ рдпрд╣ рдЬреНрдЮрд╛рди рдФрд░ рдЬрд╛рдирдХрд╛рд░реА рд╣рдорд╛рд░реА рдЬрд╝рд░реВрд░рдд рдХреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рд╣реИ, рд▓реЗрдХрд┐рди рдЪрд▓реЛ MvcScaffolding рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред

MVCScaffolding

T4Scaffolding рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
 PM> Install-Package T4Scaffolding 


LessonProject.Model рдореЗрдВ CodeTemplates / Scaffolders / IRepository рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдБ рдФрд░ рдЗрд╕рдореЗрдВ IRepository.ps1 рдлрд╝рд╛рдЗрд▓реЗрдВ (LessonProject.Model / CodeTemplates / Scaffolders / IRepository.ps1) рдЬреЛрдбрд╝реЗрдВ:
 [T4Scaffolding.Scaffolder(Description = "Create IRepository interface")][CmdletBinding()] param( [parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true)][string]$ModelType, [string]$Project, [string]$CodeLanguage, [string[]]$TemplateFolders, [switch]$Force = $false ) $foundModelType = Get-ProjectType $ModelType -Project $Project -BlockUi if (!$foundModelType) { return } # Find the IRepository interface, or create it via a template if not already present $foundIRepositoryType = Get-ProjectType IRepository -Project $Project -AllowMultiple if(!$foundIRepositoryType) { #Create IRepository $outputPath = "IRepository" $defaultNamespace = (Get-Project $Project).Properties.Item("DefaultNamespace").Value Add-ProjectItemViaTemplate $outputPath -Template IRepositoryTemplate ` -Model @{ Namespace = $defaultNamespace } ` -SuccessMessage "Added IRepository at {0}" ` -TemplateFolders $TemplateFolders -Project $Project -CodeLanguage $CodeLanguage -Force:$Force $foundIRepositoryType = Get-ProjectType IRepository -Project $Project } # Add a new property on the DbContext class if ($foundIRepositoryType) { $propertyName = $foundModelType.Name $propertyNames = Get-PluralizedWord $propertyName # This *is* a DbContext, so we can freely add a new property if there isn't already one for this model Add-ClassMemberViaTemplate -Name $propertyName -CodeClass $foundIRepositoryType -Template IRepositoryItemTemplate -Model @{ EntityType = $foundModelType; EntityTypeNamePluralized = $propertyNames; } -SuccessMessage "Added '$propertyName' to interface '$($foundIRepositoryType.FullName)'" -TemplateFolders $TemplateFolders -Project $Project -CodeLanguage $CodeLanguage } return @{ DbContextType = $foundDbContextType } 


рдлрд┐рд░ IRepositoryItemTemplate.cs.t4:
 <#@ Template Language="C#" HostSpecific="True" Inherits="DynamicTransform" #> #region <#= ((EnvDTE.CodeType)Model.EntityType).Name #> IQueryable<<#= ((EnvDTE.CodeType)Model.EntityType).Name #>> <#= Model.EntityTypeNamePluralized #> { get; } bool Create<#= ((EnvDTE.CodeType)Model.EntityType).Name #>(<#= ((EnvDTE.CodeType)Model.EntityType).Name #> instance); bool Update<#= ((EnvDTE.CodeType)Model.EntityType).Name #>(<#= ((EnvDTE.CodeType)Model.EntityType).Name #> instance); bool Remove<#=((EnvDTE.CodeType)Model.EntityType).Name #>(int id<#= ((EnvDTE.CodeType)Model.EntityType).Name #>); #endregion  IRepositoryTemplate.cs.t4: <#@ Template Language="C#" HostSpecific="True" Inherits="DynamicTransform" #> <#@ Output Extension="cs" #> using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace <#= Model.Namespace #> { public interface IRepository { IQueryable<T> GetTable<T>() where T : class; } } 


рдПрдХ рдирдИ рд╕реВрдЪрдирд╛ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдПрдБ:
рдирд╛рдордбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░

UserIDint (рд╡рд┐рджреЗрд╢реАрдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛)
рдореЗрд╕рдЬреЗрдирд╡рд░реНрдЧ (140)
AddedDatedatetime
IsReadedbit



DbContext (LessonProjectDb.dbml) рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдХрд░реЗрдВ рдФрд░ рд╕рд╣реЗрдЬреЗрдВ (ctrl-S):


рдкреИрдХреЗрдЬ рдкреНрд░рдмрдВрдзрдХ рдХрдВрд╕реЛрд▓ рдореЗрдВ, LessonProject.Model рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦреЗрдВ:
 PM> Scaffold IRepository Notify Added 'Notify' to interface 'LessonProject.Model.IRepository' 


рд╣реБрд░реНрд░реЗ! рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ! рд╕рд░рд▓, рд╕рд╣реА? рдХреБрдЫ рднреА рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ? рдареАрдХ рд╣реИ, рдЖрдЗрдП IRepository.ps1 рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:
 [T4Scaffolding.Scaffolder(Description = "Create IRepository interface")][CmdletBinding()] param( [parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true)][string]$ModelType, [string]$Project, [string]$CodeLanguage, [string[]]$TemplateFolders, [switch]$Force = $false ) 

рдпрд╣ рд╕реНрдХреИрдлрд╝реЛрд▓реНрдбрд░ рдХреЛрдб рдбрд┐рдХреНрд▓реЗрд░реЗрд╢рди рд╕рдВрд░рдЪрдирд╛ рд╣реИред $ModelType рд╡рд┐рд╢реЗрд╖ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП - рдпрд╣ рдЙрд╕ рд╡рд░реНрдЧ рдХрд╛ рдирд╛рдо рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо Scaffold IRepository Notify ред рдЕрдиреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рдпрд╛ рддреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдмрд▓, рдпрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ, рдХреЛрдб рд▓реИрдВрдЧреНрд╡реЗрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрдЧрд▓рд╛, рд╣рдо рдЗрд╕ рд╡рд░реНрдЧ рдХреА рддрд▓рд╛рд╢ рдХрд░рддреЗ рд╣реИрдВ (рдпрджрд┐ рд╣рдо рдирд╣реАрдВ рдмрдЪрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╡рд╛рдВрдЫрд┐рдд рд╡рд░реНрдЧ рдЕрднреА рддрдХ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдирд╣реАрдВ рдорд┐рд▓реЗрдЧрд╛:)
 $foundModelType = Get-ProjectType $ModelType -Project $Project -BlockUi if (!$foundModelType) { return } 


рд╡рд░реНрдЧ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╣рдо рдЕрдЧрд▓реЗ рднрд╛рдЧ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВред рдлрд╝рд╛рдЗрд▓ рдЦреЛрдЬреЗрдВ IRepository.cs рдФрд░ рдЕрдЧрд░ рдпрд╣ рдирд╣реАрдВ рд╣реИ, рддреЛ рдмрдирд╛рдПрдБ:
 # Find the IRepository interface, or create it via a template if not already present $foundIRepositoryType = Get-ProjectType IRepository -Project $Project -AllowMultiple if(!$foundIRepositoryType) { #Create IRepository $outputPath = "IRepository" $defaultNamespace = (Get-Project $Project).Properties.Item("DefaultNamespace").Value Add-ProjectItemViaTemplate $outputPath -Template IRepositoryTemplate ` -Model @{ Namespace = $defaultNamespace } ` -SuccessMessage "Added IRepository at {0}" ` -TemplateFolders $TemplateFolders -Project $Project -CodeLanguage $CodeLanguage -Force:$Force $foundIRepositoryType = Get-ProjectType IRepository -Project $Project } 


рдпрд╣рд╛рдБ, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ IRepositoryTemplate.cs.t4 рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╡рд╣рд╛рдВ рдПрдХ рд╡рд╕реНрддреБ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рджреГрд╢реНрдп рдореЗрдВ)
 -Model @{ Namespace = $defaultNamespace } ` 


рдФрд░ defaultNamespace рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкреНрд░реЙрдкрд░реНрдЯреА рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛
 Get-Project $Project).Properties.Item("DefaultNamespace").Value 


рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ, рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ (CodeTemplates / Scaffolders / IRepository / IRepositoryTemplate.cs.t4):
 namespace <#= Model.Namespace #> 


рдареАрдХ рд╣реИ, рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдИ рдЧрдИ рд╣реИ (рдпрд╛ рдорд┐рд▓реА) рдФрд░ рдЕрдЧрд▓реЗ рдЪрд░рдг рдкрд░ рдЬрд╛рдПрдВред рдпрджрд┐ рд╕рдм рдХреБрдЫ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ( $foundIRepositoryType ), рддреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде IRepositoryItemTemplate рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ рдХрдИ рдЧреБрдг рдЬреЛрдбрд╝реЗрдВ:

 # Add a new property on the DbContext class if ($foundIRepositoryType) { $propertyName = $foundModelType.Name $propertyNames = Get-PluralizedWord $propertyName # This *is* a DbContext, so we can freely add a new property if there isn't already one for this model Add-ClassMemberViaTemplate -Name $propertyName -CodeClass $foundIRepositoryType -Template IRepositoryItemTemplate -Model @{ EntityType = $foundModelType; EntityTypeNamePluralized = $propertyNames; } -SuccessMessage "Added '$propertyName' to interface '$($foundIRepositoryType.FullName)'" -TemplateFolders $TemplateFolders -Project $Project -CodeLanguage $CodeLanguage } 

рд╡рд┐рдХрд▓реНрдк:
 -Model @{ EntityType = $foundModelType; EntityTypeNamePluralized = $propertyNames; } 


рд╡реИрд╕реЗ, Get-PluralizedWord рдзреНрдпрд╛рди Get-PluralizedWord рдФрд░ рдирд┐рд░реНрдорд┐рдд рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдЗрд╕рдХреА рдХреНрдпрд╛ рднреВрдорд┐рдХрд╛ рд╣реИ:
  IQueryable<Notify> Notifies { get; } 


рдпрд╛рдиреА рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдмрд╣реБрд╡рдЪрди рдХрд╛ рдЧрдарди рдХрд┐рдпрд╛, рдФрд░ рди рдХреЗрд╡рд▓ рдЪрд░рд┐рддреНрд░ рдХреЛ рдЬреЛрдбрд╝рдХрд░, рдЬреИрд╕рд╛ рдХрд┐ рд╕реНрдирд┐рдкреЗрдЯ рдореЗрдВ рд╣реЛрдЧрд╛ред
рдЖрдЗрдП рдЗрди T4Scaffolding cmdlet рдХреЛ рджреЗрдЦреЗрдВ:


рдЕрдЪреНрдЫрд╛ рдХреНрдпрд╛? рдЙрд╕ рд╢рдХреНрддрд┐ рдХреЛ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрдкрдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рдХреА рдЬрдЧрд╣ рд▓реЗрдЧреА? рд▓реЗрдХрд┐рди (!) рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдпреЗ рд╕рднреА рдЖрджреЗрд╢ рд▓реЛрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рднреА рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдП рдереЗред рдФрд░, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░рд╛рдердорд┐рдХ рдХреБрдВрдЬреА рдХреЗрд╡рд▓ рддрднреА рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧреА рдЬрдм рдлрд╝реАрд▓реНрдб рдХреЛ рдЖрдИрдбреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдЗрд╕реЗ PervichniyKlyuch рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдиреБрд╡рд╛рджреЛрдВ рдкрд░ рдЬреНрдпрд╛рджрд╛ рднрд░реЛрд╕рд╛ рди рдХрд░реЗрдВред рдпрд╣ рдордЪрд╛рди рд╣реИ, рдЕрд░реНрдерд╛рдд рдбреНрд░рд╛рдлреНрдЯ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдирд┐рд░реНрдорд╛рдг, рдмреЗрд╣рддрд░реАрди рд╕реЗрдЯрд┐рдВрдЧ рдирд╣реАрдВред рдордЪрд╛рди рдХрд╛ рд╕рд╛рд░ рдЪрд╛рдп рдмрдирд╛рдирд╛, рд╢реБрд░реВ рдХрд░рдирд╛ рдФрд░ рдкреАрдирд╛ рд╣реИ, рдЬрдмрдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЖрдкрдХреЛ рд╕рдмрд╕реЗ рдмреБрд░рд╛ рдпрд╛рдВрддреНрд░рд┐рдХ рджрд┐рдирдЪрд░реНрдпрд╛ рдмрдирд╛рддрд╛ рд╣реИред

рдлрд┐рд░ рд╕реЗ рдЯреЗрдореНрдкрд▓реЗрдЯ, EnvDTE.CodeType


рдЪрд▓реЛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рд╕реАрдЦрддреЗ рд╣реИрдВ рдХрд┐ EnvDTE.CodeType рдХреНрдпрд╛ рд╣реИред
рдХреЛрдб рдЯрд╛рдЗрдк рдПрдХ рдЗрдВрдЯрд░рдлреЗрд╕ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЧреЗрдЯ-рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЯрд╛рдЗрдк рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдХрдХреНрд╖рд╛ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдбрд╛рд▓реА рдЬрд╛ рд╕рдХрддреА рд╣реИред
рд╣рдо рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдЬрд╛рдирддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЧреБрдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ:


рдЕрднреА рднреА рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
рд╡реИрд╕реЗ, T4Scaffolding рдореЗрдВ EnvDTEExtensions.cs рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ (рдЗрд╕рдХреЗ рд╕реНрд░реЛрдд рдпрд╣рд╛рдВ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ: http://mvcscaffolding.codeplex.com/SourceControl/changeset/view/7s57d172314 ), рдЬреЛ рдЕрдиреНрдп рд╕рд╣рд╛рдпрдХ рд╡рд░реНрдЧ рдЖрдкрдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИрдВред
рдУрд╣! рдареАрдХ рд╣реИ, рдЪрд▓реЛ рдЪреАрдЬреЛрдВ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рдХрд┐рд╕реА рднреА рдХреЛрдб рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХ рд░реВрдк рд╕реЗ рдХреНрд░рд╢ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдХрдВрдкреНрдпреВрдЯрд░ рдХреЛ рд╕рдордЭрд╛рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреИрд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдФрд░ рдЪрд╛рдп рдХрд╛ рдкреАрдЫрд╛ рдХрд░рддреЗ рд╣реИрдВред

рдЖрдЗрдП рдПрдХ рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдПрдВ: LessonProject.Scaffolding, рдФрд░ рдкрд╣рд▓реЗ рд╕рдмрдХ рд╕реЗ рдХрдХреНрд╖рд╛рдУрдВ рдХреА рдЙрд╕ рдЬреЛрдбрд╝реА рдХреЛ рддрд▓рд╡рд╛рд░ рдФрд░ рдпреЛрджреНрдзрд╛ рдХреЗ рд╕рд╛рде рд▓реЗрдВред
IWeapon.cs:
 public interface IWeapon { void Kill(); } 

Bazuka.cs:
 public class Bazuka : IWeapon { public void Kill() { Console.WriteLine("BIG BADABUM!"); } } 


Sword.cs:
 public class Sword : IWeapon { public void Kill() { Console.WriteLine("Chuk-chuck"); } } 


Warrior.cs:
 /// <summary> /// This is LEGENDARY WARRIOR! /// </summary> public class Warrior { readonly IWeapon Weapon; public Warrior(IWeapon weapon) { this.Weapon = weapon; } public void Kill() { Weapon.Kill(); } } 


T4Scaffolding рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
 Install-Package T4Scaffolding 


рд╕рд░рд▓рддрдо PowerShell (/CodeTemplates/Scaffolders/Details/Details.b1) рдмрдирд╛рдПрдБ:
 [T4Scaffolding.Scaffolder(Description = "Print Details for class")][CmdletBinding()] param( [parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true)][string]$ModelType, [string]$Project, [string]$CodeLanguage, [string[]]$TemplateFolders, [switch]$Force = $false ) $foundModelType = Get-ProjectType $ModelType -Project $Project -BlockUi if (!$foundModelType) { return } $outputPath = Join-Path "Details" $ModelType Add-ProjectItemViaTemplate $outputPath -Template Details ` -Model @{ ModelType = $foundModelType } ` -SuccessMessage "Yippee-ki-yay"` -TemplateFolders $TemplateFolders -Project $Project -CodeLanguage $CodeLanguage -Force:$Force 


рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╡рд┐рд╡рд░рдг.t4 (/CodeTemplates/Scaffolders/Details/Details.cs.t4) рдореЗрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
 <#@ template language="C#" HostSpecific="True" Inherits="DynamicTransform" debug="true" #> <#@ assembly name="System.Data.Entity" #> <#@ import namespace="System.Linq" #> <#@ import namespace="EnvDTE" #> <#@ Output Extension="txt" #> <# var modelType = (EnvDTE.CodeType)Model.ModelType; #> FullName : <#= modelType.FullName #> Name : <#= modelType.Kind #> <#= modelType.Name #> Access : <#= modelType.Access #> Attributes : <# foreach(var codeElement in modelType.Attributes) { var attr = (EnvDTE.CodeAttribute)codeElement; #> <#= attr.Name #> <# } #> Bases : <# foreach(var codeElement in modelType.Bases) { var @base = (EnvDTE.CodeType)codeElement; #> <#= @base.Name #> <# } #> Comment : <#= modelType.Comment #> DocComment : <#= modelType.DocComment #> StartPoint : Line: <#= ((EnvDTE.TextPoint)modelType.StartPoint).Line #> EndPoint : Line : <#= ((EnvDTE.TextPoint)modelType.EndPoint).Line #> Members : <# foreach(var codeElement in modelType.Members) { var member = (EnvDTE.CodeElement)codeElement; #> <#= member.Kind #> <#= member.Name #> <# } #> 


Warrior.cs рдХреЗ рд▓рд┐рдП рд╡реНрдпреБрддреНрдкрдиреНрди
 PM> Scaffold Details Warrior -Force:$true Yippee-ki-yay 




рд╣рдо рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдорд╛рд░реНрдЧрджрд░реНрд╢рдХ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдордзреНрдпрд╡рд░реНрддреА рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреНред рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рдЬреЛ рдореИрдиреБрдЕрд▓ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдирд┐рдпрдорд┐рдд рд╣реИрдВред рдЙрд╕реА рд╕рдордп, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдлрд╛рдпрджрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рдХреЛрдб рдореЗрдВ рдХрдо рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдорд╛рдирд╡ рдХрд╛рд░рдХ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВред

рдордЪрд╛рди рдХрд╛ рд╡рд░реНрдгрди

рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдЙрди рд╕рднреА рдордЪрд╛рдиреЛрдВ рдХрд╛ рдХреЛрдб рдирд╣реАрдВ рджреВрдВрдЧрд╛ рдЬреЛ рдореИрдВ рдпрд╣рд╛рдВ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдореИрдВ рдХреЗрд╡рд▓ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдирдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ред рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ, рдореИрдВ ManageAttribute рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдБрдЧрд╛ред рдпреЗ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рдЙрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рд╕реМрдВрдкреА рдЬрд╛рддреА рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЛрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рд░реНрдХрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, LangColumn рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдлрд╝реАрд▓реНрдб "рднрд╛рд╖рд╛" рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдореЙрдбрд▓рд╡реНрдпреВ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЦрд╛рддреЗ рдореЗрдВ рднреА рд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред


рдкрд░рд┐рдгрд╛рдо

рдордЪрд╛рди рдПрдХ рд░рд╛рдордмрд╛рдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрдкрдХрд░рдг рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЖрдк рдЬрд▓реНрджреА рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдХреЛрдб рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рд▓рд┐рдЦрд┐рдд рдХрдХреНрд╖рд╛рдПрдВ рдЖрдкрдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдФрд░ рдХрдИ рдореИрдиреБрдЕрд▓ рдХрд╛рдореЛрдВ рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИрдВред
рдПрдХ рдирдИ рддрд╛рд▓рд┐рдХрд╛ (рдСрдмреНрдЬреЗрдХреНрдЯ) рдмрдирд╛рдиреЗ рдХреЗ рдЪрд░рдг рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реЛрдВрдЧреЗ:


рдпрд╣ рд╕рдм рдПрдХ рд╕рд╛рде рдХрдИ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдЧрд░ рдпрд╣ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдпрд╛ рдПрдХ рдмрдбрд╝реЗ рдкреИрдЪ рдХреА рд╢реБрд░реБрдЖрдд рд╣реИред рдореИрдВ рдХрднреА-рдХрднреА 20-30 рдЯреЗрдмрд▓ рддрдХ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рдерд╛, рдЗрд╕рдореЗрдВ рд▓рдЧрднрдЧ 5 рдорд┐рдирдЯ рд▓рдЧрддреЗ рдереЗ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдореБрдЭреЗ рдкреВрд░рд╛ рджрд┐рди рдмрд┐рддрд╛рдирд╛ рдкрдбрд╝рддрд╛ред
рдордЪрд╛рди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджреЗрдЦреЗрдВ, рдЖрдк рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рдЖрдВрддрд░рд┐рдХ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдФрд░ рдЗрд╕рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВред

рд╕рднреА рд╕реНрд░реЛрдд https://bitbucket.org/chernikov/lessons рдкрд░ рд╕реНрдерд┐рдд рд╣реИрдВ

Source: https://habr.com/ru/post/In176097/


All Articles