28
1 Go# Conferences Team Leaders Day Евдокимов Николай Как перейти с двухзвенной архитектуры Desktop приложения на трехзвенную за один день [email protected]

Как перейти с двухзвенной архитектуры Desktop приложения на трехзвенную за один день

  • Upload
    gosharp

  • View
    462

  • Download
    5

Embed Size (px)

Citation preview

1

Go# Conferences – Team Leaders Day

Евдокимов Николай

Как перейти с двухзвенной

архитектуры Desktop приложения

на трехзвенную за один день

[email protected]

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-х звенной архитектуреперестанем создавать отдельные дорожки дляданных и найдем общее решение.

4Go

# C

on

fere

nce

s –

Te

am

Le

ad

ers

Day

Наш кейс – рекрутинговое приложение

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-

приложения

Что-то еще ?? ??

8Go

# C

on

fere

nce

s –

Te

am

Le

ad

ers

Day

Как это выгладит в Assembly Dependencies

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, сервисыобработкиданных

Основноеприложение-

клиентСерверноеприложение

12Go

# C

on

fere

nce

s –

Te

am

Le

ad

ers

Day

Как это выгладит в Assembly Dependencies:

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

16Go

# C

on

fere

nce

s –

Te

am

Le

ad

ers

Day

Как не хочется делать

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

Вопросы к залу

• как это сделать? какие идеи?

• и какие проблемы при ееприменении?

22Go

# C

on

fere

nce

s –

Te

am

Le

ad

ers

Day

Начнем с сервера

Вот и все!

23Go

# C

on

fere

nce

s –

Te

am

Le

ad

ers

Day

Реализация Generic контроллера в WebApi

24Go

# C

on

fere

nce

s –

Te

am

Le

ad

ers

Day

24

25Go

# C

on

fere

nce

s –

Te

am

Le

ad

ers

Day

Важные фишки по серверу

• есть Generic доступ к Entity Framework и оннам поможет

• Expressions позволяют собрать любоеусловие Where, которое будет«съедено» EF

• Отказ от классики GET, PUT, POST, DELETE

(иначе не удастся передать через Get

все Where условия)

26Go

# C

on

fere

nce

s –

Te

am

Le

ad

ers

Day

Немножко что на клиенте – выбор URL и

контроллера

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

Всем спасибо!

Евдокимов Николай

[email protected]

+7 910 404 10 72