Референсная архитектура приложения на asp.net mvc

63
Референсная архитектура приложения на ASP.NET MVC Андрей Майоров BYTE-force twitter.com/xorets

Upload: andrew-mayorov

Post on 15-Jun-2015

245 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: Референсная архитектура приложения на ASP.NET MVC

Референсная архитектура приложения на ASP.NET MVC

Андрей МайоровBYTE-force

twitter.com/xorets

Page 2: Референсная архитектура приложения на ASP.NET MVC

MVC

Page 3: Референсная архитектура приложения на ASP.NET MVC

Model-View-Controller

• Разделяет данные и представление• Модель: активная или пассивная

Controller

View Model

Page 4: Референсная архитектура приложения на ASP.NET MVC

Holy war

• Где держать бизнес-логику?• Можно брать доменные объекты в модель?

Page 5: Референсная архитектура приложения на ASP.NET MVC

Модификации: MVP

• Model-View-Presenter

Presenter

View Model

Page 6: Референсная архитектура приложения на ASP.NET MVC

Модификации: MVVM

• Model-View-ViewModel

ViewModelView Model

Page 7: Референсная архитектура приложения на ASP.NET MVC

ASP.NET

Page 8: Референсная архитектура приложения на ASP.NET MVC

Олдскульный .ASPX

• <% … %>• Code behind• Web controls

• Раздутый HTML на выходе

Page 9: Референсная архитектура приложения на ASP.NET MVC

Олдскульный .ASPX

// Hello World in C#class HelloWorld {

static void Main() {

System.Console.WriteLine("Hello, World!"); }

}

Page 10: Референсная архитектура приложения на ASP.NET MVC

ASP.NET MVC

Since 2009 A.D.

Page 11: Референсная архитектура приложения на ASP.NET MVC

Контроллер

public class HomeController : Controller{

public ActionResult Index(){

var model = …return View(model); // of type ViewResult

}}

Page 12: Референсная архитектура приложения на ASP.NET MVC

Маршруты

routes.MapRoute(name: "Default",url: "{controller}/{action}/{id}",defaults: new {

controller = "Home", action = "Index", id = UrlParameter.Optional

} );

/home/index

Page 13: Референсная архитектура приложения на ASP.NET MVC

Передача параметров

routes.MapRoute(url: "{controller}/{action}/{id}",…

/home/index/123?x=red

public ActionResult Index( int id, string x ) { … }

Page 14: Референсная архитектура приложения на ASP.NET MVC

View

• «Представление», «вьюха»• Модель → HTML• Отделено от контроллера

Page 15: Референсная архитектура приложения на ASP.NET MVC

Реализация вьюхи

• Файл /view/home/index.*• Расширения файлов:• ASPX → Web Forms Engine• CHTML → Razor• ... → Что душа пожелает

Page 16: Референсная архитектура приложения на ASP.NET MVC

DemoШаблонный проект

Page 17: Референсная архитектура приложения на ASP.NET MVC

Проблема: 1 метод на 1 URL

• Огромные контроллеры• Нечеткие критерии группировки методов• Мало базовых классов• Сервисные методы раздувают

контроллеры

Page 18: Референсная архитектура приложения на ASP.NET MVC

Решение:Только один action в

контроллере

Page 19: Референсная архитектура приложения на ASP.NET MVC

Один action на контроллер

• Execute()• Исключение из правил – NextPage ()

Page 20: Референсная архитектура приложения на ASP.NET MVC

Single responsibility principle

Kаждый объект должен иметь одну обязанность и эта обязанность должна быть полностью инкапсулирована в класс.

SOLID

Page 21: Референсная архитектура приложения на ASP.NET MVC

Сложности с именами view

/View/Home

/Execute.chtml/News

/Execute.chtml/Products

/Execute.chtml/NextPage.chtml

/Product/Execute.chtml

Page 22: Референсная архитектура приложения на ASP.NET MVC

Свой ViewEngine

/View/Home.xslt/News.xslt/Products.xslt/Products_NextPage.xslt/Product.xslt

Page 23: Референсная архитектура приложения на ASP.NET MVC

Преимущества

• Один контроллер – одно действие• Контроллеры маленькие• Общий функционал → в базовый класс• Создаем DSL*• Дружит с Dependency Injection*

Page 24: Референсная архитектура приложения на ASP.NET MVC

ControllerBase

+Model

+FillCommonData()

IndexController

+Execute()

ListControllerBase

NewsController

+Execute()

ProductsController

+Execute()

Page 25: Референсная архитектура приложения на ASP.NET MVC

Правила

1. Один контроллер – одно действие

Page 26: Референсная архитектура приложения на ASP.NET MVC

Модель

Page 27: Референсная архитектура приложения на ASP.NET MVC

Модель

• Данные для View• НЕ интерфейс получения/записи данных*

* — холивар варнинг

Page 28: Референсная архитектура приложения на ASP.NET MVC

ViewModel vs.

Domain Objects

Page 29: Референсная архитектура приложения на ASP.NET MVC

Типизированная модельvs.

Динамическая

Page 30: Референсная архитектура приложения на ASP.NET MVC

Typed vs. Dynamic

public ActionResult Execute(){

var model = new Model();…return View(model);

}

dynamic model = new ExpandoObject();

Page 31: Референсная архитектура приложения на ASP.NET MVC

Модель – член класса

Page 32: Референсная архитектура приложения на ASP.NET MVC

Правила

1. Один контроллер – одно действие2. Модель – член класса

Page 33: Референсная архитектура приложения на ASP.NET MVC

Декларация маршрутов

Page 34: Референсная архитектура приложения на ASP.NET MVC

Явная декларация маршрута

routes.MapRoute( name: "Home", url: "home",new { controller = "Home", action = "Execute" });

routes.MapRoute( name: "News", url: "news",new { controller = "News", action = "Execute" });

Url.RouteUrl( home ) // Returns “/home”

Page 35: Референсная архитектура приложения на ASP.NET MVC

Правила

1. Один контроллер – одно действие2. Модель – член класса3. Задавайте маршруты явно

Page 36: Референсная архитектура приложения на ASP.NET MVC

DemoSingle action controllers

Page 37: Референсная архитектура приложения на ASP.NET MVC

Domain Specific Language

Page 38: Референсная архитектура приложения на ASP.NET MVC

Domain Specific Language

public ActionResult Execute(){

CheckAccessRights( “index” );Model.news = SelectObjects()

.OfType( “article” )

.FilterPublished()

.Execute();

return View(Model); }

Page 39: Референсная архитектура приложения на ASP.NET MVC

ControllerBase

+Model

+FillCommonData()+CheckAccessRights()+SelectObjects()

IndexController

+Execute()

ListControllerBase

+PreparePagingData()

NewsController

+Execute()

ProductsController

+Execute()

Page 40: Референсная архитектура приложения на ASP.NET MVC

Сервисные классыControllerBase

+Model

+FillCommonData()+CheckAccessRights()+SelectObjects()

IndexController

+Execute()

ListControllerBase

+PreparePagingData()

NewsController

+Execute()

ProductsController

+Execute()

NewsService

+GetNews()

Page 41: Референсная архитектура приложения на ASP.NET MVC

DemoDSL and helpers

Page 42: Референсная архитектура приложения на ASP.NET MVC

Правила

1. Один контроллер – одно действие2. Модель – член класса3. Задавайте маршруты явно4. Делайте собственные DSL

Page 43: Референсная архитектура приложения на ASP.NET MVC

Dependency Injection

Page 44: Референсная архитектура приложения на ASP.NET MVC

Dependency inversion principle

Модули верхних уровней не должны зависеть от модулей нижних уровней. Модули должны зависеть от абстракций.

Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.

SOLID

Page 45: Референсная архитектура приложения на ASP.NET MVC

Dependency Inversion

IndexController

+Execute()

NewsServiceImpl

+GetNews()

INewsService<<interface>>

+GetNews()

Page 46: Референсная архитектура приложения на ASP.NET MVC

IndexController

+Execute()

NewsServiceImpl

+GetNews()

INewsService<<interface>>

+GetNews()

Assembler

+Resolve()

Dependency Injection

Page 47: Референсная архитектура приложения на ASP.NET MVC

Указание зависимостей

• Параметры конструктора• Свойства с атрибутами• Правила именования полей и аргументов

Page 48: Референсная архитектура приложения на ASP.NET MVC

Указание зависимостей

public class HomeController : Controller{

[Dependency] public INewsService NewsService { get; set; }

public HomeController( IDatabase database ) { … }…

}

Page 49: Референсная архитектура приложения на ASP.NET MVC

Настройка DI-контейнера

• Связь между интерфейсом и реализацией*• Контроль за жизнью объекта

* Не обязательно

<register type="INewsService"mapTo="NewsService"><lifetime type="singleton"/>

</register>

Page 50: Референсная архитектура приложения на ASP.NET MVC

DemoDependency Injection

Page 51: Референсная архитектура приложения на ASP.NET MVC

DI delivers

• Уменьшает связность приложения• Помогает писать модульные тесты• Заставляет правильно мыслить

Page 52: Референсная архитектура приложения на ASP.NET MVC

Правила

1. Один контроллер – одно действие2. Модель – член класса3. Задавайте маршруты явно4. Делайте собственные DSL5. Используйте DI

Page 53: Референсная архитектура приложения на ASP.NET MVC

Редактирование данных

Page 54: Референсная архитектура приложения на ASP.NET MVC

Обычный процесс

1. Браузер запрашивает URL2. Сервер формирует HTML, шлет на клиент3. Браузер показывает HTML4. Пользователь редактирует данные. Submit5. Браузер шлет данные в POST-запросе6. Сервер обновляет базу, goto 2

Page 55: Референсная архитектура приложения на ASP.NET MVC

Проблемы обычного подхода

• Сериализация-десериализация состояния• Постоянные перезагрузки• Трафик

Page 56: Референсная архитектура приложения на ASP.NET MVC
Page 57: Референсная архитектура приложения на ASP.NET MVC

Ajax-редактирование

1. Браузер запрашивает URL2. Сервер формирует HTML, шлет на клиент3. Браузер показывает HTML4. Пользователь редактирует данные. Submit5. Браузер шлет данные в POST-запросе6. Сервер обновляет базу7. goto 4

Page 58: Референсная архитектура приложения на ASP.NET MVC

JSON

// Браузер шлет серверу{

id: 245,price: 19.95

}

// Сервер отвечает{ success: true }

Page 59: Референсная архитектура приложения на ASP.NET MVC

Ajax delivers

• Не надо сериализовать всю страницу• При ошибке можно повторить• Трафик меньше на порядки

Page 60: Референсная архитектура приложения на ASP.NET MVC

Правила

1. Один контроллер – одно действие2. Модель – член класса3. Задавайте маршруты явно4. Делайте собственные DSL5. Используйте DI6. Используйте Ajax для редактирования

Page 61: Референсная архитектура приложения на ASP.NET MVC
Page 62: Референсная архитектура приложения на ASP.NET MVC

AngularJS - MVVM

// Model$scope.id = 245;$scope.title = “Red button”;$scope.price = 19.95;

<!-- View -->Price for {{title}}: <input type=“text” ng-model=“price” />

Page 63: Референсная архитектура приложения на ASP.NET MVC

Спасибо за внимание

Андрей МайоровBYTE-force

[email protected]/xorets