Command-Query Responsibility Segregation: теория и практика

Preview:

Citation preview

Command / Query ResponsibilitySegregation

теория и практика

О чем пойдет речь?

Немного теории С чего мы начали? Куда мы движемся? Чем пользоваться? Что в итоге?

Теория

Типовые свойства

Бизнес развивается Сложность принятия

решений Новые роли Масштабируемость Старые компоненты Расходы на разработку

С чего все начинают?

DB1 DB2 Services

Domain Model

Application Facade

Service Layer

End User Interface

BackofficeShared Services

С чего все начинают?

С чего все начинают?

Как все заканчивается?

Command / Query Responsibility Segregation

Command / Query Separation

Event Sourcing Task Based User Interface Messaging Domain Driven Design

Command/Query Separation

DB

Application Server

End User Interface

SELECT * FROM Product UPDATE Product

Command/Query Separation

DB

Application Server

End User Interface

SELECT * FROM Product UPDATE ProductQuery Command

Command/Query Separation

DB

Application Server

End User Interface

SELECT * FROM Product UPDATE ProductQuery Command

Command/Query Separation

Queries Cache

Application Server

End User Interface

SELECT * FROM Product UPDATE ProductQuery Command

Domain Persistence

Command/Query Separation

Queries Cache

Reporting

End User Interface

SELECT * FROM Product UPDATE Product

Domain Persistence

Domain Model

Command/Query Separation

Queries Cache

Reporting

End User Interface

Domain Persistence

Domain Model

AddProductToTheCart

INSERT INTO CartINSERT INTO CartItem

Command/Query Separation

View Data Cache

Reporting

End User Interface

Domain Persistence

Domain Model

AddProductToCart

INSERT INTO CartINSERT INTO CartItem

ProductToCartAdded

Command/Query Separation

View Data Cache

Reporting

End User Interface

Domain Persistence

Domain Model

AddProductToCart

INSERT INTO CartINSERT INTO CartItem

ProductToCartAdded

INSERT INTO ProductsInCart

Command/Query Separation

View Data Cache

Reporting

End User Interface

Domain Persistence

Domain Model

AddProductToCart

INSERT INTO CartINSERT INTO CartItem

ProductToCartAdded

INSERT INTO ProductsInCart

SELECT * FROM ProductsInCart

Event Sourcing

Event Sourcing

У Вас на счету: -19435.89₴ КАК?!

Event Sourcing

У Вас на счету: -19435.89₴

Перемещение средств:

Дата Сумма Балланс

Кто Зачем

28.12.2009

10000.00₴

5564.11₴

Работодатель

Премия

29.12.2009

-25000.00₴

-19435.89₴

Я На подарки

Event Sourcing

View Data Cache

Reporting

End User Interface

Domain Persistence

Domain Model

ProductToCartAddedProductFromCartRemovedProductQuantityChanged…..

Events Storage

Event Sourcing

View Data Cache

Reporting

End User Interface

Domain Persistence

Domain Model

ProductToCartAddedProductFromCartRemovedProductQuantityChanged…..

Events Storage

Task Based User Interface1. As a Tourist I want to Book a Hotel

Task Based User Interface1. As a Tourist I want to Find and Book a Hotel

Task Based User Interface1. As a Tourist I want to Find and Book a Hotel

Task Based User Interface1. As a Tourist I want to Find and Book a Hotel

Messaging

View Data Cache

Domain Model

Events Storage

Book Hotel

Messaging

View Data Cache

Domain Model

Events Storage

Book Hotel

BookHotelCommand

Messaging

View Data Cache

Domain Model

Events Storage

Book Hotel

BookHotelCommand

HotelBooked

Domain Driven Desingn

Ожидайте

Практика

С чего начали мы?

С чего начали мы?

DB1 DB2 Services

Domain Model

Application Facade

Service Layer

End User Interface

BackofficeShared Services

Как это выглядит?

Шаг №1

Database

Domain Model

Application Facade

Service Layer

User Interface

Шаг №1

Database

Domain Model

User Interface

Шаг №2

Database

Domain Model

User Interface

Reports

Шаг №2

Шаг №3

Навигации View Result

В контроллерах нет

Шаг №3

Навигации View Result

В контроллерах нет

Void-методы

В контроллерах остались

Шаг №4

Шаг №4

Шаг №4

Шаг №4

Что дальше? Event Sourcing NoSQL Cloud

Утилиты NServiceBus, MassTransit RavenDb, CouchDb,

MongoDb Lokad.CQRS

Выводы

Вывод всего один

Можно, но осторожно!

Recommended