Upload
gosharp
View
462
Download
5
Embed Size (px)
Citation preview
1
Go# Conferences – Team Leaders Day
Евдокимов Николай
Как перейти с двухзвенной
архитектуры Desktop приложения
на трехзвенную за один день
2Go
# C
on
fere
nce
s –
Te
am
Le
ad
ers
Day
О докладе
• для разогрева• зачитывается впервые• основан на практическом кейсе• делюсь рецептами• да, возможно, в нем есть ошибкипо архитектуре – будупризнателен за комментарии
При разработке трехзвенного приложения часто возникаетдублирующийся код. При добавлении новых сущностей иполей мы совершаем действия, которые укладываются вопределенный паттерн. Как говорят, "протаскиваем веревки".
В докладе Вы узнаете Design Patterns и приемы, для того, чтобыизбежать дублирований и сократить время разработки.
3Go
# C
on
fere
nce
s –
Te
am
Le
ad
ers
Day
План
1. О кейсе
2. Когда и почему мы выбираем 2-х или 3-хзвенную архитектуру
3. Организация зависимостей при 2-х и 3-х звеннойархитектуре
4. Решаем задачку – как перестать создаватьViewModel для бизнес-сущности в 2-х звеннойархитектуре
5. Решаем задачку – в 3-х звенной архитектуреперестанем создавать отдельные дорожки дляданных и найдем общее решение.
5Go
# C
on
fere
nce
s –
Te
am
Le
ad
ers
Day
• какие преимущества у двухзвеннойархитектуры?
• и какие проблемы при ееприменении?
Вопросы к залу
6Go
# C
on
fere
nce
s –
Te
am
Le
ad
ers
Day
Двухзвенная архитектура
Когда мы делаем двухзвеннуюархитектуру?
• Простенькое приложение, часто длясебя или в маленькой организации.
• Не задумываемся о безопасности• и масштабировании на большое
количество
Какие проблемы?
• Безопасность – учет действийпользователей, нехорошо «пускать вбазу»
• Доступ к SQL Server часто не проходитFirewallмногих сетей
• Всем давать пароль к SQL Server илиуправление доступом к данным черезStored Procudures?
7Go
# C
on
fere
nce
s –
Te
am
Le
ad
ers
Day
Сравним двухзвенную и трехзвенную
Параметр 2-звенная 3-звенная
Количество рабочихмест
Небольшое Любое
Сложность разработки Легко!!! Сложнее
Поддержка Легко Сложнее
Безопасность Живой доступ к SQL
Server – это минусВозможностинастройки доступа илогирования действий
Производительность Огромное количествоroundtrips при сложныхзапросах
Возможностьзапустить сложноевычисление насервере
UI Только Desktop Можно делать Web-
приложения
Что-то еще ?? ??
9Go
# C
on
fere
nce
s –
Te
am
Le
ad
ers
Day
BLL
DataServices
Организация зависимостей
при двухзвенной архитектуре
Desktop Client
Core
Enums, Extensions, Attrubutes, Utilities, Helpers
POCOs, EF connections, Interfaces
LINQ connections, сервисы обработкиданных
UI Model & UI
Весь код выполняется на клиенте!
10Go
# C
on
fere
nce
s –
Te
am
Le
ad
ers
Day
Сравним подходы в EF (5-ая версия)
Параметр Database First Code First
Затратность приизмененияхсущностей и полей
Близка к нулю – нужнопросто обновитьмодель
Миграции. Огромныепроблемы, особеннокогда меняешь связи.
Возможность stored
procedures в твоей жебазе
Да Не удобно
Возможностьопираться на views вбазе данных
Да Нет (любая миграцияможет их убить)
Что-то еще Полный контроль надбазой через SQL Server
Типа модно иприкольно
Итого Ок Нет никаких плюсов,
одни проблемы
11Go
# C
on
fere
nce
s –
Te
am
Le
ad
ers
Day
BLL
DataServices
DataServices at ClientWeb Api
Организация зависимостей
при трехзвенной архитектуре
Desktop Client
Здесь обертка!
Тут связей нет,
но есть JSON
POCOs, EF connections, Interfaces
LINQ
connections, сервисыобработкиданных
Основноеприложение-
клиентСерверноеприложение
13Go
# C
on
fere
nce
s –
Te
am
Le
ad
ers
Day
Формулировка проблемы
Мы хотим бизнес приложение, которое позволяет вводить ипросматривать разные данные. Причем, иногда это просто некие сущности– например, данные о человеке или вакансии. А иногда – это сущности сосложно вычисляемыми полями.
Классический путь
Слишком много ручной работы. Это:
• затрано• не интересно• дорого поддерживать
Задача
Создавать руками WebApi контроллеры под каждую сущность. Там писатьлогику и отдельные методы под каждый SelectBy. А на клиенте – писатьподсоединение к этому методу.
Проблема
14Go
# C
on
fere
nce
s –
Te
am
Le
ad
ers
Day
Вот о чем мы говорим
Много вот такого скучного кода насервере.
Вам не кажется, что для каждойсущности вы пишите примерно то же
самое?
15Go
# C
on
fere
nce
s –
Te
am
Le
ad
ers
Day
Маленькая задачка – подача модели в UI
с INotifyPropertyChanged
17Go
# C
on
fere
nce
s –
Te
am
Le
ad
ers
Day
Маленькая задачка– подача модели в UI
с INotifyPropertyChanged
Решение:
PostSharp – NotifyPropertyChanged attribute – прямо в Partial
классе EntityFramework
Что дает:позволяет не создавать класс под ViewModel
для данной сущности.
18Go
# C
on
fere
nce
s –
Te
am
Le
ad
ers
Day
Основная проблема – протащить
редактирование данных через Web API
Все просто:
- изменить сущность- db.SaveChanges
Очень не очевидно:
• объекты просто живут в памяти, и добазы данных далеко
• никто не следит за тем, менялся лиобъект
Что нам делать?
• отследить изменение свойств объекта• отправить запрос на изменение на
сервер по Web Api
• серверу – внести изменения в БД.
Две задачи:
• передача данных и команды• слежение за изменениями
2-звенное приложение 3-звенное приложение
19Go
# C
on
fere
nce
s –
Te
am
Le
ad
ers
Day
Что мы хотим?
Чтобы Where прошли через JSON! А на сервере – чтобы EntityFramework
этот Where применила.
Чего мы не хотим – писать 1000 вот таких штук:
20Go
# C
on
fere
nce
s –
Te
am
Le
ad
ers
Day
Передача данных – решение.
Вызов в том, чтобы сделать это Generic
Уровень модели(ViewModel) у формы
IRepository<BusinessObject>
Реализациярепозиторияна клиенте
задача репозитория – следить заизменениями!
Контроллер WebApi
Реализация сервисана сервере
Коннектор к WebApi
тут они обменяются Json
здесь Entity Framework сохранитизменения
КЛИЕНТ
СЕРВЕР
21Go
# C
on
fere
nce
s –
Te
am
Le
ad
ers
Day
Вопросы к залу
• как это сделать? какие идеи?
• и какие проблемы при ееприменении?
25Go
# C
on
fere
nce
s –
Te
am
Le
ad
ers
Day
Важные фишки по серверу
• есть Generic доступ к Entity Framework и оннам поможет
• Expressions позволяют собрать любоеусловие Where, которое будет«съедено» EF
• Отказ от классики GET, PUT, POST, DELETE
(иначе не удастся передать через Get
все Where условия)
27Go
# C
on
fere
nce
s –
Te
am
Le
ad
ers
Day
Давайте посмотрим, что мы получили
Уровень модели(ViewModel) у формы
IRepository<BusinessObject>
Реализациярепозиторияна клиенте
задача репозитория – следить заизменениями!
Контроллер WebApi
Реализация сервисана сервере
Коннектор к WebApi
тут они обменяются Json
здесь Entity Framework сохранитизменения
КЛИЕНТ
СЕРВЕР
28Go
# C
on
fere
nce
s –
Te
am
Le
ad
ers
Day
Всем спасибо!
Евдокимов Николай
+7 910 404 10 72