SlideShare uma empresa Scribd logo
1 de 74
Prosta architektura
dla nieprostego systemu
Mateusz Stasch
Mateusz Stasch
@mattstasch
http://mattstasch.net
CQRS
CQRS
CQRS
jest trudny
CQRS
jest trudny *
CQRS
CQRS
Implementacja zasady CQS
w postaci wzorca architektonicznego*
DBModel
Business
Logic
UI
DTO
DTO
ORM
DBDomain Model
Commands
UI
DTO
DTO
ORM
Queries
DB
WRITE Domain ModelCommands
UI
DTO
DTO
ORM
Queries READ Model
DB
WRITE Domain ModelCommands
UI
DTO
DTO
ORM
Queries
SELECT … FROM … WHERE …
READ
Model
READ DB
WRITE Domain ModelCommands
UI
DTO
DTO Queries
SELECT … FROM … WHERE …
WRITE DB
PROJECTION
READ DB
WRITE Domain ModelCommands
UI
DTO
DTO Queries
SELECT … FROM … WHERE …
PROJECTION
Event Stream
CQRS != ES
public class UserManager : IUserManager
{
public UserDetails UpdateUserStatus(...)
{
// ...
return user;
}
}
public class UserManager : IUserManager
{
public UserDetails UpdateUserStatus(...)
{
// ...
return user;
}
}
RESPONSIBILITY?
Manager
Command – zmienia stan systemu
Query – odczytuje stan systemu
public interface IQuery<out TResult>
{
TResult Execute();
}
public interface IQuery<out TResult>
{
TResult Execute();
}
public class QueryDispatcher : IQueryDispatcher
{
TResult Run<TResult>(IQuery<TResult> query)
{
using(var tx = session.OpenReadOnlyTransaction())
{
return query.Execute();
}
}
}
public interface IQuery<out TResult>
{
TResult Execute();
}
public class QueryDispatcher : IQueryDispatcher
{
TResult Run<TResult>(IQuery<TResult> query)
{
using(var tx = session.OpenReadOnlyTransaction())
{
return query.Execute();
}
}
}
public interface ICommandHandler<in TCommand>
{
void Execute(TCommand command);
}
public interface ICommandHandler<in TCommand>
{
void Execute(TCommand command);
}
public class CommandDispatcher : ICommandDispatcher
{
public void Execute<in TCommand>(TCommand command)
{
var handler = ResolveCommandHandler<TCommand>();
handler.Execute(command);
}
}
public interface ICommandHandler<in TCommand>
{
void Execute(TCommand command);
}
public class CommandDispatcher : ICommandDispatcher
{
public void Execute<in TCommand>(TCommand command)
{
var handler = ResolveCommandHandler<TCommand>();
handler.Execute(command);
}
}
Semantyka
Ekspresywność kodu
Semantyka
Ekspresywność kodu
Semantyka
Single Responsibility
using(var tx = session.BeginTransaction())
{
try
{
var user = repository.GetById<UserDetails>(id);
user.Status = newStatus;
tx.Commit();
return user;
}
catch
{
tx.Rollback();
throw;
}
}
public class UserManager : IUserManager
{
[Transactional]
public UserDetails UpdateUserStatus(...)
{
// ...
return user;
}
}
using(var tx = session.BeginTransaction())
{
try
{
var user = repository.GetById<UserDetails>(id);
user.Status = newStatus;
tx.Commit();
return user;
}
catch
{
tx.Rollback();
throw;
}
}
using(var tx = session.BeginTransaction())
{
try
{
var user = repository.GetById<UserDetails>(id);
user.Status = newStatus;
tx.Commit();
return user;
}
catch
{
tx.Rollback();
throw;
}
}
public UpdateUserStatusCommandHandler
: ICommandHandler<UpdateUserStatusCommand>
{
public void Execute(UpdateUserStatusCommand command)
{
var user = repository.GetById(command.Id);
user.Status = command.NewStatus;
}
}
public class CommandDispatcher : ICommandDispatcher
{
public void Execute<in TCommand>(TCommand command)
{
var handler = ResolveCommandHandler<TCommand>();
using(var tx = session.OpenTransaction())
{
try
{
handler.Execute(command);
tx.Commit();
}
catch
{
tx.Rollback();
throw;
}
}
}
}
public class TransactionalCommandDispatcherDecorator : ICommandDispatcher
{
public TransactionalCommandDispatcher(ICommandDispatcher …)
{…}
public void Execute<in TCommand>(TCommand command)
{
using(var tx = session.OpenTransaction())
{
try
{
decoratedDispatcher.Execute(command);
tx.Commit();
}
catch
{
tx.Rollback();
throw;
}
}
}
}
Logika biznesowa
Infrastruktura
Database
Infrastructure
Domain
Business Logic
UI
Domena
Database
Infrastructure
Domain
Querying
UI
Database
Infrastructure
Domain
Querying
UI
DependencyInjection
IQuery
IQueryDispatcher
GetUserDetailsQuery
Database
Infrastructure
Domain
Querying
UI
IUserRepository
ICommand ICommandHandler
ICommandDispatcher
DependencyInjection
IQuery
IQueryDispatcher
UpdateStatusCommand(Handler)
GetUserDetailsQuery
Database
Infrastructure
Domain
Querying
UI
IUserRepository
ICommand ICommandHandler
ICommandDispatcher
DependencyInjection
IQuery
IQueryDispatcher
UpdateStatusCommand(Handler)
CommandDispatcher
UserRepository
QueryDispatcher
GetUserDetailsQuery
Domain
Infrastructure
ICommandDispatcher
CommandDispatcher
ICommand
DeactivateUserCommand
IQuery
QueryDispatcher
IUserRepository
UserRepository
…
using(var tx = session.BeginTransaction())
{
try
{
var user = repository.GetById<UserDetails>(id);
user.Status = newStatus;
tx.Commit();
return user;
}
catch
{
tx.Rollback();
throw;
}
}
public UpdateUserStatusCommandHandler
: ICommandHandler<UpdateUserStatusCommand>
{
// ...
public void Execute(UpdateUserStatusCommand command)
{
var user = repository.GetById(command.Id);
user.Status = command.NewStatus;
}
}
public UpdateUserStatusCommandHandler
: ICommandHandler<UpdateUserStatusCommand>
{
// ...
public void Execute(UpdateUserStatusCommand command)
{
var user = repository.GetById(command.Id);
user.Status = command.NewStatus;
}
}
Robienie CRUDa w CQRSie jest bezsensowne!
Robienie CRUDa w CQRSie jest bezsensowne!
public DeactivateUserCommandHandler
: ICommandHandler<DeactivateUserCommand>
{
// ...
public void Execute(DeactivateUserCommand command)
{
var user = repository.GetById(command.Id);
user.Deactivate();
}
}
READ DB
WRITE Domain ModelCommands
UI
ORM
Queries
SELECT … FROM … WHERE …
WRITE DB
PROJECTION
READ DB
WRITE Domain ModelCommands
UI
ORM
Queries
SELECT … FROM … WHERE …
WRITE DB
PROJECTION
READ DB
READ DB WRITE DB!=
READ DB WRITE DB!=
Eager Read Derivation
READ DB ==
READ DB
READ DB
READ DB
READ DB
WRITE Domain ModelCommands
UI
ORM
Queries
SELECT … FROM … WHERE …
WRITE DB
PROJECTION
Eventual Consistency
DB
WRITE Domain ModelCommands
UI
ORM
Queries
SELECT … FROM … WHERE …
READ
Model
Jak zacząć?
Jakiś Framework?
Nope!
Napisz to sam!
To proste!
public interface IQuery<out TResult>
{
TResult Execute();
}
public class QueryDispatcher : IQueryDispatcher
{
TResult Run<out TResult>(IQuery<TResult> query)
{
using(var tx = session.OpenReadOnlyTransaction())
{
return query.Execute();
}
}
}
public interface IQuery<out TResult>
{
TResult Execute();
}
public class QueryDispatcher : IQueryDispatcher
{
TResult Run<out TResult>(IQuery<TResult> query)
{
using(var tx = session.OpenReadOnlyTransaction())
{
return query.Execute();
}
}
}
public interface ICommandHandler<in TCommand>
{
void Execute(TCommand command);
}
public class CommandDispatcher : ICommandDispatcher
{
public void Execute<in TCommand>(TCommand command)
{
var handler = ResolveCommandHandler<TCommand>();
handler.Execute(command);
}
}
public class TaskController
{
public TaskController(TaskManager taskManager) {…}
public ActionResult MarkAsFinalized(TaskId taskId)
{
taskManager.UpdateStatus(taskId, TaskStatuses.Finalized);
taskManager.UpdateFinalizationDate(taskId, DateTime.Now);
taskManager.UpdateFinalizedBy(taskId, CurrentUser.Id);
return Success;
}
}
public class TaskController : Controller
{
public TaskController(CommandDispatcher commandDispatcher) {…}
public ActionResult MarkAsFinalized(TaskId taskId)
{
var finalizeCommand = new FinalizeTaskCommand(taskId,
CurrrentUser.Id);
commandDispatcher.Execute(finalizeCommand);
return Success;
}
}
public class FinalizeTaskCommand
{
public FinalizeTaskCommand(TaskId id, UserId finalizingUser)
{…}
public TaskId Id { get; private set; }
public UserId FinalizingUser { get; private set; }
}
public class FinalizeTaskCommandHandler
: ICommandHandler<FinalizeTaskCommand>
{
public FinalizeTaskCommandHanlder(
ITaskRepository repository,
IDateTimeProvider dtp
) {…}
public void Execute(FinalizeTaskCommand command)
{
var task = repository.GetById(command.Id);
task.Status = TaskStatuses.Done;
task.FinalizedAt = dtp.Now();
task.FinalizedBy = command.FinalizingUser;
}
}
public class FinalizeTaskCommandHandler
: ICommandHandler<FinalizeTaskCommand>
{
public FinalizeTaskCommandHanlder(
ITaskRepository repository,
IDateTimeProvider dtp
) {…}
public void Execute(FinalizeTaskCommand command)
{
var task = repository.GetById(command.Id);
task.Finalize(dtp.Now(), command.FinalizingUser);
}
}
Q&A
Prosta architektura
dla nieprostego systemu
Mateusz Stasch
Dziękuję
za uwagę
Prosta architektura
dla nieprostego systemu
Mateusz Stasch

Mais conteúdo relacionado

Semelhante a 4Developers 2015: CQRS - Prosta architektura dla nieprostego systemu! - Mateusz Stasch

Symfony2 - from the trenches
Symfony2 - from the trenchesSymfony2 - from the trenches
Symfony2 - from the trenchesLukas Smith
 
My way to clean android - Android day salamanca edition
My way to clean android - Android day salamanca editionMy way to clean android - Android day salamanca edition
My way to clean android - Android day salamanca editionChristian Panadero
 
Projet d'accès aux résultats des étudiant via client mobile
Projet d'accès aux résultats des étudiant via client mobile Projet d'accès aux résultats des étudiant via client mobile
Projet d'accès aux résultats des étudiant via client mobile Patrick Bashizi
 
Enabling Microservices @Orbitz - DockerCon 2015
Enabling Microservices @Orbitz - DockerCon 2015Enabling Microservices @Orbitz - DockerCon 2015
Enabling Microservices @Orbitz - DockerCon 2015Steve Hoffman
 
Inversion Of Control
Inversion Of ControlInversion Of Control
Inversion Of ControlChad Hietala
 
The Developer Conference - CloudKit, entendendo a Cloud da Apple
The Developer Conference - CloudKit, entendendo a Cloud da AppleThe Developer Conference - CloudKit, entendendo a Cloud da Apple
The Developer Conference - CloudKit, entendendo a Cloud da AppleRodrigo Leite
 
Docker Swarm & Machine
Docker Swarm & MachineDocker Swarm & Machine
Docker Swarm & MachineEueung Mulyana
 
When Docker Engine 1.12 features unleashes software architecture
When Docker Engine 1.12 features unleashes software architectureWhen Docker Engine 1.12 features unleashes software architecture
When Docker Engine 1.12 features unleashes software architecture Adrien Blind
 
Command pattern vs. MVC: Lean Beans (are made of this)
Command pattern vs. MVC: Lean Beans (are made of this)Command pattern vs. MVC: Lean Beans (are made of this)
Command pattern vs. MVC: Lean Beans (are made of this)philipdurbin
 
Dont break the glass
Dont break the glassDont break the glass
Dont break the glassJohn Kinsella
 
Using linuxKit to build custom rancherOS systems
Using linuxKit to build custom rancherOS systems Using linuxKit to build custom rancherOS systems
Using linuxKit to build custom rancherOS systems Moby Project
 
The Next Step in AS3 Framework Evolution
The Next Step in AS3 Framework EvolutionThe Next Step in AS3 Framework Evolution
The Next Step in AS3 Framework EvolutionFITC
 
Fun Teaching MongoDB New Tricks
Fun Teaching MongoDB New TricksFun Teaching MongoDB New Tricks
Fun Teaching MongoDB New TricksMongoDB
 
Defcon_Oracle_The_Making_of_the_2nd_sql_injection_worm
Defcon_Oracle_The_Making_of_the_2nd_sql_injection_wormDefcon_Oracle_The_Making_of_the_2nd_sql_injection_worm
Defcon_Oracle_The_Making_of_the_2nd_sql_injection_wormguest785f78
 
Symfony2 from the Trenches
Symfony2 from the TrenchesSymfony2 from the Trenches
Symfony2 from the TrenchesJonathan Wage
 
HashiStack. To the cloud and beyond...
HashiStack. To the cloud and beyond...HashiStack. To the cloud and beyond...
HashiStack. To the cloud and beyond...Oleg Lobanov
 
Developing and deploying applications with Spring Boot and Docker (@oakjug)
Developing and deploying applications with Spring Boot and Docker (@oakjug)Developing and deploying applications with Spring Boot and Docker (@oakjug)
Developing and deploying applications with Spring Boot and Docker (@oakjug)Chris Richardson
 

Semelhante a 4Developers 2015: CQRS - Prosta architektura dla nieprostego systemu! - Mateusz Stasch (20)

Symfony2 - from the trenches
Symfony2 - from the trenchesSymfony2 - from the trenches
Symfony2 - from the trenches
 
JDBC Tutorial
JDBC TutorialJDBC Tutorial
JDBC Tutorial
 
My way to clean android - Android day salamanca edition
My way to clean android - Android day salamanca editionMy way to clean android - Android day salamanca edition
My way to clean android - Android day salamanca edition
 
Projet d'accès aux résultats des étudiant via client mobile
Projet d'accès aux résultats des étudiant via client mobile Projet d'accès aux résultats des étudiant via client mobile
Projet d'accès aux résultats des étudiant via client mobile
 
Enabling Microservices @Orbitz - DockerCon 2015
Enabling Microservices @Orbitz - DockerCon 2015Enabling Microservices @Orbitz - DockerCon 2015
Enabling Microservices @Orbitz - DockerCon 2015
 
Inversion Of Control
Inversion Of ControlInversion Of Control
Inversion Of Control
 
The Developer Conference - CloudKit, entendendo a Cloud da Apple
The Developer Conference - CloudKit, entendendo a Cloud da AppleThe Developer Conference - CloudKit, entendendo a Cloud da Apple
The Developer Conference - CloudKit, entendendo a Cloud da Apple
 
Docker Swarm & Machine
Docker Swarm & MachineDocker Swarm & Machine
Docker Swarm & Machine
 
When Docker Engine 1.12 features unleashes software architecture
When Docker Engine 1.12 features unleashes software architectureWhen Docker Engine 1.12 features unleashes software architecture
When Docker Engine 1.12 features unleashes software architecture
 
Command pattern vs. MVC: Lean Beans (are made of this)
Command pattern vs. MVC: Lean Beans (are made of this)Command pattern vs. MVC: Lean Beans (are made of this)
Command pattern vs. MVC: Lean Beans (are made of this)
 
Dont break the glass
Dont break the glassDont break the glass
Dont break the glass
 
Using linuxKit to build custom rancherOS systems
Using linuxKit to build custom rancherOS systems Using linuxKit to build custom rancherOS systems
Using linuxKit to build custom rancherOS systems
 
The Next Step in AS3 Framework Evolution
The Next Step in AS3 Framework EvolutionThe Next Step in AS3 Framework Evolution
The Next Step in AS3 Framework Evolution
 
Fun Teaching MongoDB New Tricks
Fun Teaching MongoDB New TricksFun Teaching MongoDB New Tricks
Fun Teaching MongoDB New Tricks
 
Terrific Frontends
Terrific FrontendsTerrific Frontends
Terrific Frontends
 
Defcon_Oracle_The_Making_of_the_2nd_sql_injection_worm
Defcon_Oracle_The_Making_of_the_2nd_sql_injection_wormDefcon_Oracle_The_Making_of_the_2nd_sql_injection_worm
Defcon_Oracle_The_Making_of_the_2nd_sql_injection_worm
 
Symfony2 from the Trenches
Symfony2 from the TrenchesSymfony2 from the Trenches
Symfony2 from the Trenches
 
HashiStack. To the cloud and beyond...
HashiStack. To the cloud and beyond...HashiStack. To the cloud and beyond...
HashiStack. To the cloud and beyond...
 
Brad Wood - CommandBox CLI
Brad Wood - CommandBox CLI Brad Wood - CommandBox CLI
Brad Wood - CommandBox CLI
 
Developing and deploying applications with Spring Boot and Docker (@oakjug)
Developing and deploying applications with Spring Boot and Docker (@oakjug)Developing and deploying applications with Spring Boot and Docker (@oakjug)
Developing and deploying applications with Spring Boot and Docker (@oakjug)
 

Último

BUS PASS MANGEMENT SYSTEM USING PHP.pptx
BUS PASS MANGEMENT SYSTEM USING PHP.pptxBUS PASS MANGEMENT SYSTEM USING PHP.pptx
BUS PASS MANGEMENT SYSTEM USING PHP.pptxalwaysnagaraju26
 
WSO2CON 2024 - How to Run a Security Program
WSO2CON 2024 - How to Run a Security ProgramWSO2CON 2024 - How to Run a Security Program
WSO2CON 2024 - How to Run a Security ProgramWSO2
 
VTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnVTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnAmarnathKambale
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisamasabamasaba
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension AidPhilip Schwarz
 
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...WSO2
 
WSO2CON 2024 Slides - Unlocking Value with AI
WSO2CON 2024 Slides - Unlocking Value with AIWSO2CON 2024 Slides - Unlocking Value with AI
WSO2CON 2024 Slides - Unlocking Value with AIWSO2
 
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...WSO2
 
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...Jittipong Loespradit
 
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...masabamasaba
 
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...masabamasaba
 
Announcing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareAnnouncing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareJim McKeeth
 
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital TransformationWSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital TransformationWSO2
 
WSO2CON 2024 Slides - Open Source to SaaS
WSO2CON 2024 Slides - Open Source to SaaSWSO2CON 2024 Slides - Open Source to SaaS
WSO2CON 2024 Slides - Open Source to SaaSWSO2
 
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...masabamasaba
 
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...masabamasaba
 
WSO2Con2024 - Hello Choreo Presentation - Kanchana
WSO2Con2024 - Hello Choreo Presentation - KanchanaWSO2Con2024 - Hello Choreo Presentation - Kanchana
WSO2Con2024 - Hello Choreo Presentation - KanchanaWSO2
 
Artyushina_Guest lecture_YorkU CS May 2024.pptx
Artyushina_Guest lecture_YorkU CS May 2024.pptxArtyushina_Guest lecture_YorkU CS May 2024.pptx
Artyushina_Guest lecture_YorkU CS May 2024.pptxAnnaArtyushina1
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...masabamasaba
 

Último (20)

BUS PASS MANGEMENT SYSTEM USING PHP.pptx
BUS PASS MANGEMENT SYSTEM USING PHP.pptxBUS PASS MANGEMENT SYSTEM USING PHP.pptx
BUS PASS MANGEMENT SYSTEM USING PHP.pptx
 
WSO2CON 2024 - How to Run a Security Program
WSO2CON 2024 - How to Run a Security ProgramWSO2CON 2024 - How to Run a Security Program
WSO2CON 2024 - How to Run a Security Program
 
VTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnVTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learn
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
 
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
 
Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...
Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...
Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...
 
WSO2CON 2024 Slides - Unlocking Value with AI
WSO2CON 2024 Slides - Unlocking Value with AIWSO2CON 2024 Slides - Unlocking Value with AI
WSO2CON 2024 Slides - Unlocking Value with AI
 
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
 
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
 
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
 
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
 
Announcing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareAnnouncing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK Software
 
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital TransformationWSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
 
WSO2CON 2024 Slides - Open Source to SaaS
WSO2CON 2024 Slides - Open Source to SaaSWSO2CON 2024 Slides - Open Source to SaaS
WSO2CON 2024 Slides - Open Source to SaaS
 
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
 
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
 
WSO2Con2024 - Hello Choreo Presentation - Kanchana
WSO2Con2024 - Hello Choreo Presentation - KanchanaWSO2Con2024 - Hello Choreo Presentation - Kanchana
WSO2Con2024 - Hello Choreo Presentation - Kanchana
 
Artyushina_Guest lecture_YorkU CS May 2024.pptx
Artyushina_Guest lecture_YorkU CS May 2024.pptxArtyushina_Guest lecture_YorkU CS May 2024.pptx
Artyushina_Guest lecture_YorkU CS May 2024.pptx
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
 

4Developers 2015: CQRS - Prosta architektura dla nieprostego systemu! - Mateusz Stasch