SlideShare a Scribd company logo
1 of 77
Download to read offline
ASP.NET MVC за
пределами Hello World
1
Дятлов Александр
О себе
Веб-разработка около 4х лет
ASP.NET MVC более 3х лет
Благодаря ASP.NET влюбился в платформу .NET
Люблю выпить и поговорить про архитектуру :)
2
О чем доклад?
Архитектура MVC
Организация бизнес логики приложения
Повторное использование кода
Немного о модульном тестировании
Обработка исключительных ситуаций
3
История паттерна MVC
Трюгве Миккель Хейердал Реенскауг
1979
Smalltalk
Xerox
4
Пассивная модель
5
Controller
View Model
Активная модель
6
Controller
View Model
Первые шаги в изучении
Мануалы
Сайт ASP.NET
Habrahabr Tutorials
...
Учебники по ASP.NET MVC
Адам Фримен
Джеффри Палермо
...
7
8
Проблемы понимания
Последствия
1. Бизнес-логика в контроллерах
9
public ActionResult GetByTagAndDate( string tagName, DateTime date,
string authorName)
{
var posts = _dbContext.Posts
.Where(p => p. Tags.Any(t => t.Name == tagName)
&& p.CreateOn < date
&& p.Author.Name == authorName);
if (!posts.Any())
return HttpNotFound();
return View(posts);
}
10
public ActionResult GetByTagAndDate(string tagName, DateTime date, string authorName) {
...
bool troll = (bool)Session["IsTroll"];
if (troll || _dbContext.Posts.Where(p => p.Author.Name == User.Identity.Name)
.SelectMany(p => p.Marks).Count(m => m.IsLike == true) >
_dbContext.Marks.Count(m => m.Author.Name == User.Identity.Name && m.IsLike
== false))
ViewBag.IsTroll = true;
...
11
И еще немножко бизнес-логики
12 public class PostsV1Controller : Controller {
13 public ActionResult GetByTagAndDate(string tagName,
DateTime date, string authorName) { … }
40 public ActionResult GetPostByTitle(string title) { … }
90 public ActionResult GetAll() { … }
1090 public ActionResult History() { … }
}
12
И начинается АД
Последствия
1. Бизнес-логика в контроллерах
2. Использование динамических объектов для передачи данных
представлению
13
public ActionResult GetByTagAndDate( string tagName, DateTime date,
string authorName)
{
...
ViewBag.IsTroll = true;
return View(posts);
}
14
Потенциальное падение во время исполнения
Проверка на стороне представления
@{
var troll = false;
if (ViewBag.IsTroll != null)
troll = (bool)ViewBag.IsTroll;
}
@if (troll) {
<p>Ты мерзкий тролль!!!</p>
}
15
Последствия
1. Бизнес-логика в контроллерах
2. Использование динамической типизации для передачи данных
представлению
3. Навешивание на бизнес-сущность атрибутов валидации
16
public class User_Entity {
[Required]
[StringLength(100)]
[Remote("CheckUserName", "Account")]
public string Name { get; set; }
[Required]
[SecurePassword]
public string Password { get; set; }
}
17
public class User_Entity {
[Required]
[StringLength(100)]
[Remote("CheckUserName", "Account")]
public string Name { get; set; }
[Required]
[SecurePassword]
public string Password { get; set; }
}
18
Последствия
1. Бизнес-логика в контроллерах
2. Использование динамической типизации для передачи данных
представлению
3. Навешивание на бизнес-сущность атрибутов валидации
4. Использование одной модели для отображения и получения
данных
19
20
User_Entity
[Required]
[StringLength(100)]
[Remote("CheckUserName", "Account")]
public string Name { get; set; }
[Required]
[SecurePassword]
public string Password { get; set; }
Список пользователей
21
User_Entity
[Required]
[StringLength(100)]
[Remote("CheckUserName", "Account")]
public string Name { get; set; }
[Required]
[SecurePassword]
public string Password { get; set; }
Список пользователей
Информация о
пользователе
22
User_Entity
[Required]
[StringLength(100)]
[Remote("CheckUserName", "Account")]
public string Name { get; set; }
[Required]
[SecurePassword]
public string Password { get; set; }
Список пользователей
Информация о
пользователе
Сменить пароль
23
User_Entity
[Required]
[StringLength(100)]
[Remote("CheckUserName", "Account")]
public string Name { get; set; }
[Required]
[SecurePassword]
public string Password { get; set; }
Список пользователей
Информация о
пользователе
Сменить пароль
Регистрация
Взаимодействия компонентов
24
Контроллер Модель
Представление
Хранение
(обычно в
реляционной
базе данных)
Запрос HTTP
Ответ Модель
представления
Взаимодействия компонентов
25
Контроллер Модель
Представление
Хранение
(обычно в
реляционной
базе данных)
Запрос HTTP
Ответ Модель
представления
Обязанности контроллера
26
Cache
Session
Cookies
Controller
Обязанности контроллера
27
Сервисы
Запросы
...
Команды
User.Identity.Name
...
Controller
28
Тестирование контроллеров
public ActionResult GetByTagAndDate( string tagName, DateTime date,
string authorName)
{
...
bool troll = (bool)Session["IsTroll"];
...
return View(posts);
}
29
Зависимость от сессии
Если необходимость в тестировании
контроллеров осталась?
30
public ActionResult GetByTagAndDate(string tagName, DateTime date, string authorName,
Troll troll)
{
...
if (troll)
...
return View(posts);
}
31
Получение через параметры
public class TrollModelBinder : IModelBinder {
public object BindModel(ControllerContext controllerContext,
ModelBindingContext bindingContext) {
var troll =
(Troll)controllerContext.HttpContext.Session["IsTroll"];
if (troll == null) {
troll = new Troll();
controllerContext.HttpContext.Session["IsTroll"] = troll;
}
return troll;
}
}
32
Кастомный биндинг
Регистрация
protected void Application_Start()
{
...
ModelBinders.Binders.Add( typeof(Troll), new TrollModelBinder());
BundleTable.Bundles.EnableDefaultBundles();
...
}
33
Взаимодействия компонентов
34
Контроллер Модель
Представление
Хранение
(обычно в
реляционной
базе данных)
Запрос HTTP
Ответ Модель
представления
Модель / Виды
35
АМ
~80%
БМ
~20%
Личного опыт
АМ / БМ
Анемичная модель (бедная модель)
Сущности представляют данные
Сущности это плоские классы
Богатая модель
Единый язык между разработчиком и специалистом
Модель это дистиллированное знание
36
Анемичная модель
37
CRUD_Service<T>
+Create()
+Read()
+Update()
+Delete()
Post
Topic
Tag
...
38
Единый механизм
В реальном мире
Интернет-блог
Каталог товаров
Сайты галереи
Сайты портфолио
Сайты визитки
и т.д.
39
В реальном мире
Интернет-блог
Каталог товаров
Сайты галереи
Сайты портфолио
Сайты визитки
и т.д.
40
Богатая модель / Кредит
41
Сredit_Entity
int DaysCount
float InterestRate
decimal Sum
decimal Payment()
Богатая модель / Грузоперевозки
42
Shipping_Entity
float CargoTotal
float CargoCurrent
int OverflowRate
bool Add(float cargo)
float FreePlace()
В реальном мире
Автоматизация банковских систем
Автоматизация транспортной логистики
Экспертные системы
и т.д.
43
В реальном мире
Автоматизация банковских систем
Автоматизация транспортной логистики
Экспертные системы
и т.д.
44
Доступ к данным
45
DAL / Рекомендации
Persistence Ignorance
Сущности не должны зависеть от способа хранения данных
Использование паттерна Repository
46
Repository
47
CRUD_Repository<T>
+Create()
+Read()
+Update()
+Delete()
Post
Topic
...
CRUD_Service<T>
Troll_Detector
+ Detect()
DAL / Рекомендации
Persistence Ignorance
Сущности не должны зависеть от способа хранения данных
Использование паттерна Repository
Более гибкое решение:
Использование CQRS
48
Взаимодействия компонентов
49
Контроллер Модель
Представление
Хранение
(обычно в
реляционной
базе данных)
Запрос HTTP
Ответ Модель
представления
public class PostsGetByTagAndDateViewModel {
public IEnumerable<Post> Posts { get; set; }
public bool IsTroll { get; set; }
public PostsGetByTagAndDateViewModel (IEnumerable<Post> posts,
bool isTroll) {
Posts = posts;
IsTroll = isTroll;
}
}
50
Модель представления
Заполнение модели
public ActionResult GetByTagAndDate(string tagName, DateTime date,
string authorName, TrollState trollState)
{
...
if (!posts.Any())
return HttpNotFound();
return View(new PostsGetByTagAndDateViewModel(posts, trollState.IsTroll));
}
51
public class RegistrationViewModel {
[Required]
[StringLength(100)]
[Remote("CheckUserName", "Account")]
public string Name { get; set; }
[Required]
[StringLength(100)]
[SecurePassword]
public string Password { get; set; }
}
52
Классы помощники
public static class EmailHelpers {
public static IHtmlString Email(this HtmlHelper html, string address,
string name = null) {
return new HtmlString($"<a href="mailto: { address }"> { name
?? address } </a>");
}
}
<span>@Html.Email("google@gmail.com")</span>
<span>@Html.Email("google@gmail.com", "Отправить письмо")</span>
53
Классы помощники
@helper Email(string address, string name = null)
{
<a href="mailto:@(address)">@(name ?? address) </a>
}
<span>@Helpers.Email("google@gmail.com")</span>
<span>@Helpers.Email("google@gmail.com", "Отправить письмо")</span>
54
App_CodeHelpers.cshtml
Классы помощники
@helper Email(string address, string name = null)
{
<a href="mailto:@(address)">@(name ?? address) </a>
}
<span>@Helpers.Email("google@gmail.com")</span>
<span>@Helpers.Email("google@gmail.com", "Отправить письмо")</span>
55
App_CodeHelpers.cshtml
JavaScript код в представлениях
56
@model IEnumerable<Post>
@{
Layout = "~/Areas/Admin/Views/Shared/_Layout.cshtml";
var ajaxSave = new AjaxOptions {
Url = Url.Action("Edit"),
OnSuccess = "ajaxSuccess"
};
}
<table class="table-striped table-hover tablesorter table">...</table>
<script type="text/javascript" src="@Url.Content("~/Scripts/table.js")"></script>
<script type="text/javascript">
$(".tablesorter").tablesorter();
$("#TableId").change(function () {
window.location.href = "/Posts/Edit/" + $("#PostId").val();
});
</script>
57
58
Вынос JS кода из представлений
App.views.Posts.Troll = ( function () {
// private scope
return {
init: function () {
// public API
}
}
})(jQuery);
59
Вызов в представлении
PostsTroll.js
App.views.Posts.Troll = (function () {
// private scope
return {
init: function () {
// public API
}
}
})(jQuery);
<div> </div>
<script>
App.views.Posts.Troll.Init();
</script>
Проблема HTTP 1.0 / 1.1
Дополнительные расходы на установку
соединения для каждого запроса
Конвейерная передача HTTP
Параллельные HTTP соединения в современных
браузерах от 4 до 8
60
Проблема HTTP 1.0 / 1.1
Дополнительные расходы на установку
соединения для каждого запроса
Конвейерная передача HTTP
Параллельные HTTP соединения в современных
браузерах от 4 до 8
61
Минификация
Объединение JS в один
файл при помощи bundle
62
public class BundleConfig {
public static void RegisterBundles(
BundleCollection bundles) {
bundles.Add(new ScriptBundle("~/scripts/jquery")
.Include("~/Scripts/jquery-{version}.js")
.Include("~/Scripts/PostsTroll.js"));
}
}
Минификация
Объединение JS в один
файл при помощи bundle
Использование
сторонних сборщиков
gulp
grunt
...
63
public class BundleConfig {
public static void RegisterBundles(
BundleCollection bundles) {
bundles.Add(new ScriptBundle("~/scripts/jquery")
.Include("~/Scripts/jquery-{version}.js")
.Include("~/Scripts/PostsTroll.js"));
}
}
Собрать части в целое
64
Архитектура современного веб-приложения
65
Веб
User Interface
Технические сервисы
Technical
Services
Зависимости
Вспомогательная логика
Services
Бизнес-логика (М)
Models
Domain
Что делать если?
66
Веб
User Interface
Технические сервисы
Technical
Services
Зависимости
Болееспецифическаялогика
Вспомогательная логика
Services
Бизнес-логика (М)
Models
Domain
Инверсия управления (IoC)
67
Веб
User Interface
Технические сервисы
Technical
Services
IPayService
Зависимости
Болееспецифическаялогика
Вспомогательная логика
Services
Бизнес-логика (М)
Models
Domain
Инверсия управления (IoC)
68
Веб
User Interface
Технические сервисы
Technical
Services
IPayService
PayService
IPayService
Зависимости
Болееспецифическаялогика
Вспомогательная логика
Services
Бизнес-логика (М)
Models
Domain
Регистрация зависимостей
public class DIConfig : Module {
protected override void Load(ContainerBuilder builder) {
builder.RegisterType< PayService>().As<IPayService>();
…
base.Load(builder);
}
}
69
Что делать если что-то пошло не так?
70
Иерархия исключений .NET
71
Exception
ApplicationExceptionSystemException
Но не бывает так легко
72
Решение
73
DemoException
ApplicationException
Решение
74
DemoException
LogicExceptionFatalException
ApplicationException
Обрабатываем конкретные типы
75
try {
// Логика подтверждения оплаты
}
catch (PaymentNotVerifiedLogicException ex)
{
PaymentVerified = false;
_logger.Warning($"При оплате возникли проблемы { ex }");
}
Полезные материалы
http://www.asp.net
http://sergeyteplyakov.blogspot.ru
http://metanit.com/sharp/mvc5/23.1.php
http://professorweb.ru/my/ASP_NET/mvc/level1/1_7.php
https://habrahabr.ru/post/73692/
http://andrey.moveax.ru/page/aspnet-mvc-3-in-depth
76
Спасибо за внимание!
77
dyatlovall@gmail.com
vk.com/dspro

More Related Content

What's hot

C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.Igor Shkulipa
 
Архитектура. Доступноять программных систем.
Архитектура. Доступноять программных систем.Архитектура. Доступноять программных систем.
Архитектура. Доступноять программных систем.Dima Dzuba
 
Практика Lock-free. RealTime-сервер
Практика Lock-free. RealTime-серверПрактика Lock-free. RealTime-сервер
Практика Lock-free. RealTime-серверPlatonov Sergey
 
C++ STL & Qt. Занятие 07.
C++ STL & Qt. Занятие 07.C++ STL & Qt. Занятие 07.
C++ STL & Qt. Занятие 07.Igor Shkulipa
 
Java осень 2014 занятие 1
Java осень 2014 занятие 1Java осень 2014 занятие 1
Java осень 2014 занятие 1Technopark
 
C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.Igor Shkulipa
 
C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.Igor Shkulipa
 
C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.Igor Shkulipa
 
C++ STL & Qt. Занятие 08.
C++ STL & Qt. Занятие 08.C++ STL & Qt. Занятие 08.
C++ STL & Qt. Занятие 08.Igor Shkulipa
 
Клиент-серверное взаимодействие под android в деталях
Клиент-серверное взаимодействие под android в деталяхКлиент-серверное взаимодействие под android в деталях
Клиент-серверное взаимодействие под android в деталяхKirill Zotin
 
C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.Igor Shkulipa
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммыPlatonov Sergey
 
C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.Igor Shkulipa
 
C++ STL & Qt. Занятие 03.
C++ STL & Qt. Занятие 03.C++ STL & Qt. Занятие 03.
C++ STL & Qt. Занятие 03.Igor Shkulipa
 
Григорий Демченко — Асинхронное программирование и сопрограммы
Григорий Демченко — Асинхронное программирование и сопрограммыГригорий Демченко — Асинхронное программирование и сопрограммы
Григорий Демченко — Асинхронное программирование и сопрограммыYandex
 
Testing RIA with Selenium
Testing RIA with SeleniumTesting RIA with Selenium
Testing RIA with SeleniumSergey Shvets
 
МАИ, Сети ЭВМ, Лекция №5
МАИ, Сети ЭВМ, Лекция №5МАИ, Сети ЭВМ, Лекция №5
МАИ, Сети ЭВМ, Лекция №5Dima Dzuba
 
Лекция Android. БД SQLite, ContentProvider, Loader
Лекция Android. БД SQLite, ContentProvider, LoaderЛекция Android. БД SQLite, ContentProvider, Loader
Лекция Android. БД SQLite, ContentProvider, LoaderАлександр Брич
 

What's hot (20)

C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.
 
Архитектура. Доступноять программных систем.
Архитектура. Доступноять программных систем.Архитектура. Доступноять программных систем.
Архитектура. Доступноять программных систем.
 
Практика Lock-free. RealTime-сервер
Практика Lock-free. RealTime-серверПрактика Lock-free. RealTime-сервер
Практика Lock-free. RealTime-сервер
 
C++ STL & Qt. Занятие 07.
C++ STL & Qt. Занятие 07.C++ STL & Qt. Занятие 07.
C++ STL & Qt. Занятие 07.
 
Java осень 2014 занятие 1
Java осень 2014 занятие 1Java осень 2014 занятие 1
Java осень 2014 занятие 1
 
C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.
 
C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.
 
Coding like a sex
Coding like a sexCoding like a sex
Coding like a sex
 
C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.
 
C++ STL & Qt. Занятие 08.
C++ STL & Qt. Занятие 08.C++ STL & Qt. Занятие 08.
C++ STL & Qt. Занятие 08.
 
Клиент-серверное взаимодействие под android в деталях
Клиент-серверное взаимодействие под android в деталяхКлиент-серверное взаимодействие под android в деталях
Клиент-серверное взаимодействие под android в деталях
 
C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммы
 
C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.
 
Bytecode
BytecodeBytecode
Bytecode
 
C++ STL & Qt. Занятие 03.
C++ STL & Qt. Занятие 03.C++ STL & Qt. Занятие 03.
C++ STL & Qt. Занятие 03.
 
Григорий Демченко — Асинхронное программирование и сопрограммы
Григорий Демченко — Асинхронное программирование и сопрограммыГригорий Демченко — Асинхронное программирование и сопрограммы
Григорий Демченко — Асинхронное программирование и сопрограммы
 
Testing RIA with Selenium
Testing RIA with SeleniumTesting RIA with Selenium
Testing RIA with Selenium
 
МАИ, Сети ЭВМ, Лекция №5
МАИ, Сети ЭВМ, Лекция №5МАИ, Сети ЭВМ, Лекция №5
МАИ, Сети ЭВМ, Лекция №5
 
Лекция Android. БД SQLite, ContentProvider, Loader
Лекция Android. БД SQLite, ContentProvider, LoaderЛекция Android. БД SQLite, ContentProvider, Loader
Лекция Android. БД SQLite, ContentProvider, Loader
 

Similar to ASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NET

Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Yandex
 
ASP.NET MVC - как построить по-настоящему гибкое веб-приложение
ASP.NET MVC - как построить по-настоящему гибкое веб-приложениеASP.NET MVC - как построить по-настоящему гибкое веб-приложение
ASP.NET MVC - как построить по-настоящему гибкое веб-приложениеAlexander Byndyu
 
Референсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVCРеференсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVCAndrew Mayorov
 
The Old New ASP.NET
The Old New ASP.NETThe Old New ASP.NET
The Old New ASP.NETVitaly Baum
 
Обзор платформы B4
Обзор платформы B4Обзор платформы B4
Обзор платформы B4Bars Group
 
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Andrey Rebrov
 
Стандарты и соглашения в сложных ООП-приложениях
Стандарты и соглашения в сложных ООП-приложенияхСтандарты и соглашения в сложных ООП-приложениях
Стандарты и соглашения в сложных ООП-приложенияхMagecom Ukraine
 
Mikhail Valkov_Antipatterns
Mikhail Valkov_AntipatternsMikhail Valkov_Antipatterns
Mikhail Valkov_AntipatternsCiklum
 
C# Web. Занятие 11.
C# Web. Занятие 11.C# Web. Занятие 11.
C# Web. Занятие 11.Igor Shkulipa
 
Aspect Oriented Programming and Design Patterns
Aspect Oriented Programming and Design PatternsAspect Oriented Programming and Design Patterns
Aspect Oriented Programming and Design PatternsAndrey Gordienkov
 
AOP and Design Patterns (GoF)
AOP and Design Patterns (GoF)AOP and Design Patterns (GoF)
AOP and Design Patterns (GoF)Andrey Gordienkov
 
паттерны программирования
паттерны программированияпаттерны программирования
паттерны программированияguestfc8ae0
 
Yii2
Yii2Yii2
Yii2Noveo
 
Database (Lecture 14 – database)
Database (Lecture 14 – database)Database (Lecture 14 – database)
Database (Lecture 14 – database)Noveo
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6Technopark
 
Семь тысяч Rps, один go
Семь тысяч Rps, один goСемь тысяч Rps, один go
Семь тысяч Rps, один goBadoo Development
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорьdrupalconf
 
вебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNGвебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNGAndrey Rebrov
 

Similar to ASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NET (20)

Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
 
ASP.NET MVC - как построить по-настоящему гибкое веб-приложение
ASP.NET MVC - как построить по-настоящему гибкое веб-приложениеASP.NET MVC - как построить по-настоящему гибкое веб-приложение
ASP.NET MVC - как построить по-настоящему гибкое веб-приложение
 
Референсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVCРеференсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVC
 
The Old New ASP.NET
The Old New ASP.NETThe Old New ASP.NET
The Old New ASP.NET
 
Обзор платформы B4
Обзор платформы B4Обзор платформы B4
Обзор платформы B4
 
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
 
Стандарты и соглашения в сложных ООП-приложениях
Стандарты и соглашения в сложных ООП-приложенияхСтандарты и соглашения в сложных ООП-приложениях
Стандарты и соглашения в сложных ООП-приложениях
 
Mikhail Valkov_Antipatterns
Mikhail Valkov_AntipatternsMikhail Valkov_Antipatterns
Mikhail Valkov_Antipatterns
 
C# Web. Занятие 11.
C# Web. Занятие 11.C# Web. Занятие 11.
C# Web. Занятие 11.
 
Agile Instrumentation
Agile InstrumentationAgile Instrumentation
Agile Instrumentation
 
Aspect Oriented Programming and Design Patterns
Aspect Oriented Programming and Design PatternsAspect Oriented Programming and Design Patterns
Aspect Oriented Programming and Design Patterns
 
AOP and Design Patterns (GoF)
AOP and Design Patterns (GoF)AOP and Design Patterns (GoF)
AOP and Design Patterns (GoF)
 
паттерны программирования
паттерны программированияпаттерны программирования
паттерны программирования
 
Yii2
Yii2Yii2
Yii2
 
Zend Framework и Doctrine
Zend Framework и DoctrineZend Framework и Doctrine
Zend Framework и Doctrine
 
Database (Lecture 14 – database)
Database (Lecture 14 – database)Database (Lecture 14 – database)
Database (Lecture 14 – database)
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
 
Семь тысяч Rps, один go
Семь тысяч Rps, один goСемь тысяч Rps, один go
Семь тысяч Rps, один go
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
 
вебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNGвебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNG
 

More from Dev2Dev

D2D Чипец 2 Николай Иванов - Data Informed Design
D2D Чипец 2 Николай Иванов - Data Informed DesignD2D Чипец 2 Николай Иванов - Data Informed Design
D2D Чипец 2 Николай Иванов - Data Informed DesignDev2Dev
 
D2D Чипец 2 Сергей Ашмаров - Как из ничего сделать крутой фестивальный проект
D2D Чипец 2 Сергей Ашмаров - Как из ничего сделать крутой фестивальный проектD2D Чипец 2 Сергей Ашмаров - Как из ничего сделать крутой фестивальный проект
D2D Чипец 2 Сергей Ашмаров - Как из ничего сделать крутой фестивальный проектDev2Dev
 
D2D Чипец 2 Виталий Мазуревич - Engeneering design
D2D Чипец 2 Виталий Мазуревич - Engeneering designD2D Чипец 2 Виталий Мазуревич - Engeneering design
D2D Чипец 2 Виталий Мазуревич - Engeneering designDev2Dev
 
D2D Чипец 2 Николай Страх - Как студии параллельно с основной деятельностью з...
D2D Чипец 2 Николай Страх - Как студии параллельно с основной деятельностью з...D2D Чипец 2 Николай Страх - Как студии параллельно с основной деятельностью з...
D2D Чипец 2 Николай Страх - Как студии параллельно с основной деятельностью з...Dev2Dev
 
D2D Чипец 2 Алексей Резванов - "Особенности работы на международных рынках"
D2D Чипец 2 Алексей Резванов - "Особенности работы на международных рынках"D2D Чипец 2 Алексей Резванов - "Особенности работы на международных рынках"
D2D Чипец 2 Алексей Резванов - "Особенности работы на международных рынках"Dev2Dev
 
D2D Чипец 2 Максим Кулдошин - Как работать в Красноярске и не умереть со скуки
D2D Чипец 2 Максим Кулдошин - Как работать в Красноярске и не умереть со скукиD2D Чипец 2 Максим Кулдошин - Как работать в Красноярске и не умереть со скуки
D2D Чипец 2 Максим Кулдошин - Как работать в Красноярске и не умереть со скукиDev2Dev
 
D2D Чипец 2 Алексей Раменский - Видение рынка дизайна и проектирования от экс...
D2D Чипец 2 Алексей Раменский - Видение рынка дизайна и проектирования от экс...D2D Чипец 2 Алексей Раменский - Видение рынка дизайна и проектирования от экс...
D2D Чипец 2 Алексей Раменский - Видение рынка дизайна и проектирования от экс...Dev2Dev
 
D2D Pizza JS Роман Сальников "Redux: one state to rule them all"
D2D Pizza JS Роман Сальников "Redux: one state to rule them all"D2D Pizza JS Роман Сальников "Redux: one state to rule them all"
D2D Pizza JS Роман Сальников "Redux: one state to rule them all"Dev2Dev
 
D2D Pizza JS Илья Беда "Куда мы все катимся?"
D2D Pizza JS Илья Беда "Куда мы все катимся?"D2D Pizza JS Илья Беда "Куда мы все катимся?"
D2D Pizza JS Илья Беда "Куда мы все катимся?"Dev2Dev
 
D2D Pizza JS Игорь Ковган "Koa поможет"
D2D Pizza JS Игорь Ковган "Koa поможет"D2D Pizza JS Игорь Ковган "Koa поможет"
D2D Pizza JS Игорь Ковган "Koa поможет"Dev2Dev
 
D2D Pizza JS Владимир Кожин "Jii - фреймворк, который Вы уже знаете"
D2D Pizza JS Владимир Кожин "Jii - фреймворк, который Вы уже знаете"D2D Pizza JS Владимир Кожин "Jii - фреймворк, который Вы уже знаете"
D2D Pizza JS Владимир Кожин "Jii - фреймворк, который Вы уже знаете"Dev2Dev
 
D2D Pizza JS Тимофей Чаптыков "CSS-менеджмент в 2016"
D2D Pizza JS Тимофей Чаптыков "CSS-менеджмент в 2016"D2D Pizza JS Тимофей Чаптыков "CSS-менеджмент в 2016"
D2D Pizza JS Тимофей Чаптыков "CSS-менеджмент в 2016"Dev2Dev
 
Всё будет в Ажуре. Завершинский Денис D2D Just.NET
Всё будет в Ажуре. Завершинский Денис D2D Just.NETВсё будет в Ажуре. Завершинский Денис D2D Just.NET
Всё будет в Ажуре. Завершинский Денис D2D Just.NETDev2Dev
 
Micro orm для жизни. Кожевников Дмитрий D2D Just.NET
Micro orm для жизни. Кожевников Дмитрий D2D Just.NETMicro orm для жизни. Кожевников Дмитрий D2D Just.NET
Micro orm для жизни. Кожевников Дмитрий D2D Just.NETDev2Dev
 
Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET
Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NETNemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET
Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NETDev2Dev
 
Трудности повторного использования
Трудности повторного использованияТрудности повторного использования
Трудности повторного использованияDev2Dev
 
RxJava + Retrofit
RxJava + RetrofitRxJava + Retrofit
RxJava + RetrofitDev2Dev
 
Теории и практики функционального программирования.
Теории и практики функционального программирования.Теории и практики функционального программирования.
Теории и практики функционального программирования.Dev2Dev
 
Разработка приложений в Android studio
Разработка приложений в Android studioРазработка приложений в Android studio
Разработка приложений в Android studioDev2Dev
 
Мотивация ИТ-персонала - шаг за шагом - Марина Семехина, Илья Горбаров Dev2De...
Мотивация ИТ-персонала - шаг за шагом - Марина Семехина, Илья Горбаров Dev2De...Мотивация ИТ-персонала - шаг за шагом - Марина Семехина, Илья Горбаров Dev2De...
Мотивация ИТ-персонала - шаг за шагом - Марина Семехина, Илья Горбаров Dev2De...Dev2Dev
 

More from Dev2Dev (20)

D2D Чипец 2 Николай Иванов - Data Informed Design
D2D Чипец 2 Николай Иванов - Data Informed DesignD2D Чипец 2 Николай Иванов - Data Informed Design
D2D Чипец 2 Николай Иванов - Data Informed Design
 
D2D Чипец 2 Сергей Ашмаров - Как из ничего сделать крутой фестивальный проект
D2D Чипец 2 Сергей Ашмаров - Как из ничего сделать крутой фестивальный проектD2D Чипец 2 Сергей Ашмаров - Как из ничего сделать крутой фестивальный проект
D2D Чипец 2 Сергей Ашмаров - Как из ничего сделать крутой фестивальный проект
 
D2D Чипец 2 Виталий Мазуревич - Engeneering design
D2D Чипец 2 Виталий Мазуревич - Engeneering designD2D Чипец 2 Виталий Мазуревич - Engeneering design
D2D Чипец 2 Виталий Мазуревич - Engeneering design
 
D2D Чипец 2 Николай Страх - Как студии параллельно с основной деятельностью з...
D2D Чипец 2 Николай Страх - Как студии параллельно с основной деятельностью з...D2D Чипец 2 Николай Страх - Как студии параллельно с основной деятельностью з...
D2D Чипец 2 Николай Страх - Как студии параллельно с основной деятельностью з...
 
D2D Чипец 2 Алексей Резванов - "Особенности работы на международных рынках"
D2D Чипец 2 Алексей Резванов - "Особенности работы на международных рынках"D2D Чипец 2 Алексей Резванов - "Особенности работы на международных рынках"
D2D Чипец 2 Алексей Резванов - "Особенности работы на международных рынках"
 
D2D Чипец 2 Максим Кулдошин - Как работать в Красноярске и не умереть со скуки
D2D Чипец 2 Максим Кулдошин - Как работать в Красноярске и не умереть со скукиD2D Чипец 2 Максим Кулдошин - Как работать в Красноярске и не умереть со скуки
D2D Чипец 2 Максим Кулдошин - Как работать в Красноярске и не умереть со скуки
 
D2D Чипец 2 Алексей Раменский - Видение рынка дизайна и проектирования от экс...
D2D Чипец 2 Алексей Раменский - Видение рынка дизайна и проектирования от экс...D2D Чипец 2 Алексей Раменский - Видение рынка дизайна и проектирования от экс...
D2D Чипец 2 Алексей Раменский - Видение рынка дизайна и проектирования от экс...
 
D2D Pizza JS Роман Сальников "Redux: one state to rule them all"
D2D Pizza JS Роман Сальников "Redux: one state to rule them all"D2D Pizza JS Роман Сальников "Redux: one state to rule them all"
D2D Pizza JS Роман Сальников "Redux: one state to rule them all"
 
D2D Pizza JS Илья Беда "Куда мы все катимся?"
D2D Pizza JS Илья Беда "Куда мы все катимся?"D2D Pizza JS Илья Беда "Куда мы все катимся?"
D2D Pizza JS Илья Беда "Куда мы все катимся?"
 
D2D Pizza JS Игорь Ковган "Koa поможет"
D2D Pizza JS Игорь Ковган "Koa поможет"D2D Pizza JS Игорь Ковган "Koa поможет"
D2D Pizza JS Игорь Ковган "Koa поможет"
 
D2D Pizza JS Владимир Кожин "Jii - фреймворк, который Вы уже знаете"
D2D Pizza JS Владимир Кожин "Jii - фреймворк, который Вы уже знаете"D2D Pizza JS Владимир Кожин "Jii - фреймворк, который Вы уже знаете"
D2D Pizza JS Владимир Кожин "Jii - фреймворк, который Вы уже знаете"
 
D2D Pizza JS Тимофей Чаптыков "CSS-менеджмент в 2016"
D2D Pizza JS Тимофей Чаптыков "CSS-менеджмент в 2016"D2D Pizza JS Тимофей Чаптыков "CSS-менеджмент в 2016"
D2D Pizza JS Тимофей Чаптыков "CSS-менеджмент в 2016"
 
Всё будет в Ажуре. Завершинский Денис D2D Just.NET
Всё будет в Ажуре. Завершинский Денис D2D Just.NETВсё будет в Ажуре. Завершинский Денис D2D Just.NET
Всё будет в Ажуре. Завершинский Денис D2D Just.NET
 
Micro orm для жизни. Кожевников Дмитрий D2D Just.NET
Micro orm для жизни. Кожевников Дмитрий D2D Just.NETMicro orm для жизни. Кожевников Дмитрий D2D Just.NET
Micro orm для жизни. Кожевников Дмитрий D2D Just.NET
 
Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET
Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NETNemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET
Nemerle. метапрограммирование в .NET - Зимин Aлександр D2D Just.NET
 
Трудности повторного использования
Трудности повторного использованияТрудности повторного использования
Трудности повторного использования
 
RxJava + Retrofit
RxJava + RetrofitRxJava + Retrofit
RxJava + Retrofit
 
Теории и практики функционального программирования.
Теории и практики функционального программирования.Теории и практики функционального программирования.
Теории и практики функционального программирования.
 
Разработка приложений в Android studio
Разработка приложений в Android studioРазработка приложений в Android studio
Разработка приложений в Android studio
 
Мотивация ИТ-персонала - шаг за шагом - Марина Семехина, Илья Горбаров Dev2De...
Мотивация ИТ-персонала - шаг за шагом - Марина Семехина, Илья Горбаров Dev2De...Мотивация ИТ-персонала - шаг за шагом - Марина Семехина, Илья Горбаров Dev2De...
Мотивация ИТ-персонала - шаг за шагом - Марина Семехина, Илья Горбаров Dev2De...
 

Recently uploaded (9)

Cyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdfCyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdf
 
MS Navigating Incident Response [RU].pdf
MS Navigating Incident Response [RU].pdfMS Navigating Incident Response [RU].pdf
MS Navigating Incident Response [RU].pdf
 
Ransomware_Q3 2023. The report [RU].pdf
Ransomware_Q3 2023.  The report [RU].pdfRansomware_Q3 2023.  The report [RU].pdf
Ransomware_Q3 2023. The report [RU].pdf
 
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdfMalware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
 
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdfСИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
 
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
 
2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf
 
CVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdfCVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdf
 
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
 

ASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NET