SlideShare a Scribd company logo
mauroservienti
designing a UI for
Microservices
Mauro Servienti
mauroservienti
spaghetti
trademark
is mine
mauroservienti
All I wanna do
when I wake up in
the morning is…
Rosanna, Toto. Toto IV
mauroservienti
Buy a "Banana Protector"
mauroservienti
Does a page like that exist?
mauroservienti
There is no "Banana Protector"
Sales
Warehouse
Shipping
Catalog
mauroservienti
Domain Model Decomposition
services owning
their own piece of
information
Single Responsibility Principle
mauroservienti
How can we design something like that?
mauroservienti
Denormalization Temptations…
Catalog Sales Shipping Warehouse
De-normalized API
Client
“Product”ViewModel…
/products/1
mauroservienti
that’s a
cache
mauroservienti
Oh…and by the way…
mauroservienti
Whatchoo talkin' 'bout, Willis?
a report
not a cache
mauroservienti
It's a reporting and integration issue
• We're crossing a “boundary”
• Data flow out of each service to the user
• Users are already pulling things on demand
• let's benefit of that
mauroservienti
ViewModel Composition
/products/
Catalog Sales Shipping Warehouse
Client
PKPKPKPK
1
ViewModel…
mauroservienti
ViewModel Composition
Catalog
Sales
Shipping
Warehouse
composition gateway
HTTP Request -> /products/1 Catalog
Handler
Sales
Handler
Shipping
Handler
Warehouse
Handler
Request matching
HTTP Response -> ViewModel
Composition
Composed ViewModel
mauroservienti
Creates empty ViewModel
Request Handling
mauroservienti
class ProductDetailsGetHandler : IHandleRequests
{
}
Request Matching
mauroservienti
class ProductDetailsGetHandler : IHandleRequests
{
}
public bool Matches(RouteData routeData, string httpVerb, HttpRequest request)
{
}
var controller = (string)routeData.Values["controller"];
return HttpMethods.IsGet(httpVerb)
&& controller.ToLowerInvariant() == "products"
&& routeData.Values.ContainsKey("id");
Composition
mauroservienti
class ProductDetailsGetHandler : IHandleRequests
{
}
public bool Matches(RouteData routeData, string httpVerb, HttpRequest request)
{
}
public async Task Handle(string requestId, dynamic vm,
RouteData routeData, HttpRequest request)
{
var id = (string)routeData.Values["id"];
var url = $"http://localhost:5002/api/product-details/product/{id}";
var response = await new HttpClient().GetAsync(url);
dynamic details = await response.Content.AsExpando();
vm.ProductName = details.Name;
vm.ProductDescription = details.Description;
}
Composition
mauroservienti
class ProductDetailsGetHandler : IHandleRequests
{
}
public bool Matches(RouteData routeData, string httpVerb, HttpRequest request)
{
}
public async Task Handle(string requestId, dynamic vm,
RouteData routeData, HttpRequest request)
{
var id = (string)routeData.Values["id"];
var url = $"http://localhost:5002/api/product-details/product/{id}";
var response = await new HttpClient().GetAsync(url);
dynamic details = await response.Content.AsExpando();
vm.ProductName = details.Name;
vm.ProductDescription = details.Description;
}
retrieve data from
your favorite source
Output
mauroservienti
{
"productName": "Banana Holder",
"productDescription": "Outdoor travel cute banana protector storage box",
"productPrice": 10,
"productShippingOptions": "Express Delivery, Regular mail",
"productInventory": 4,
"productOutOfStock": false
}
Output
mauroservienti
{
"productName": "Banana Holder",
"productDescription": "Outdoor travel cute banana protector storage box",
"productPrice": 10,
"productShippingOptions": "Express Delivery, Regular mail",
"productInventory": 4,
"productOutOfStock": false
}
Catalog
Sales
Shipping
Warehouse
is all what glitters gold?
mauroservienti
What about grids?
mauroservienti
ProductNameA
€ 20.00
cover
image
A
Supplier A
ProductNameB
€ 20.00
cover
image
B
Supplier B
ProductNameC
€ 20.00
cover
image
C
Supplier C
ProductNameD
€ 20.00
cover
image
D
Supplier D
mauroservienti
View
Model/available/products
Catalog
Handler
View
Model
Catalog
Handler
ProductNameA
€ 20.00
cover
image
A
Supplier A
ProductNameB
€ 20.00
cover
image
B
Supplier B
ProductNameC
€ 20.00
cover
image
C
Supplier C
ProductNameD
€ 20.00
cover
image
D
Supplier D
load available products
mauroservienti
/available/products
client-side message broker
Sales
Handler
“….”
Handler
Sales
Handler
“….”
Handler
ProductNameA
€ 20.00
cover
image
A
Supplier A
ProductNameB
€ 20.00
cover
image
B
Supplier B
ProductNameC
€ 20.00
cover
image
C
Supplier C
ProductNameD
€ 20.00
cover
image
D
Supplier D
publish ` AvailableProductsLoaded`
receive event
mauroservienti
Catalog
Handler
View
Model
Catalog
Handler
/available/products
receive event
ProductNameA
€ 20.00
cover
image
A
Supplier A
ProductNameB
€ 20.00
cover
image
B
Supplier B
ProductNameC
€ 20.00
cover
image
C
Supplier C
ProductNameD
€ 20.00
cover
image
D
Supplier D
mauroservienti
Sales
Handler
“….”
Handler
Sales
Handler
“….”
Handler
Catalog
Handler
View
Model
Catalog
Handler
/available/products
Request Handling
mauroservienti
class AvailableProductsGetHandler : IHandleRequests
{
}
Composition
mauroservienti
class AvailableProductsGetHandler : IHandleRequests
{
}
public async Task Handle(string requestId, dynamic vm,
RouteData routeData, HttpRequest request)
{
var url = $"http://localhost:5002/api/available/products";
var client = new HttpClient();
var response = await client.GetAsync(url);
var availableProducts = await response.Content.As<int[]>();
var availableProductsViewModel = MapToDictionary(availableProducts);
await vm.RaiseEvent(new AvailableProductsLoaded()
{
AvailableProductsViewModel = availableProductsViewModel
});
vm.AvailableProducts = availableProductsViewModel.Values.ToList();
}
Composition
mauroservienti
var availableProducts = await response.Content.As<int[]>();
var availableProductsViewModel = MapToDictionary(availableProducts);
await vm.RaiseEvent(new AvailableProductsLoaded()
{
AvailableProductsViewModel = availableProductsViewModel
});
vm.AvailableProducts = availableProductsViewModel.Values.ToList();
Event Subscribers
class AvailableProductsLoadedSubscriber : ISubscribeToCompositionEvents
{
}
mauroservienti
Composition
class AvailableProductsLoadedSubscriber : ISubscribeToCompositionEvents
{
}
public void Subscribe(IPublishCompositionEvents publisher)
{
publisher.Subscribe<AvailableProductsLoaded>(async (requestId,
pageViewModel,
@event,
routeData,
request) =>
{
});
}
mauroservienti
Composition
}
async (requestId, pageViewModel, @event, routeData, request) =>
{
var ids = string.Join(",", @event.AvailableProductsViewModel.Keys);
var url = $"http://localhost:5001/api/prices/products/{ids}";
var client = new HttpClient();
var response = await client.GetAsync(url);
dynamic[] productPrices = await response.Content.AsExpandoArray();
foreach (dynamic pp in productPrices)
{
@event.AvailableProductsViewModel[(int)productPrice.Id].ProductPrice = pp.Price;
}
});
mauroservienti
Output
mauroservienti
{
"avalableProducts": [{
"id": 1,
"productName": "Banana Holder",
"productDescription": "Outdoor travel cute banana protector storage box",
"productPrice": 10,
"inventory": 4,
},{
"id": 2,
"productName": "Nokia Lumia 635",
"…": "…",
}]
}
Output
mauroservienti
{
"avalableProducts": [{
"id": 1,
"productName": "Banana Holder",
"productDescription": "Outdoor travel cute banana protector storage box",
"productPrice": 10,
"inventory": 4,
},{
"id": 2,
"productName": "Nokia Lumia 635",
"…": "…",
}]
}
Catalog
Sales
Warehouse
ViewModel Composition
Catalog
Sales
Shipping
Warehouse
composition gateway
HTTP Request -> /products/1 Catalog
Handler
Sales
Handler
Shipping
Handler
Warehouse
HandlerHTTP Response -> ViewModel
mauroservienti
Request matching
Composition
Composed ViewModel
Creates empty ViewModel
Composed ViewModel
ViewModel Composition
Catalog
Sales
Shipping
Warehouse
composition gateway
HTTP Request -> /products/1
HTTP Response -> ViewModel
mauroservienti
Creates empty ViewModel
Request matching
Composition
Catalog
Handler
Sales
Handler
Shipping
Handler
Warehouse
Handler
Vertical ownership
Catalog Sales Shipping Warehouse
mauroservienti
Vertical ownership
Catalog Sales Shipping Warehouse
Doc DB
+
HTTP
DB DB
back-end back-end
Web
Proxy
API
API
Proxy to
3° party
API
1 month
cache
24 hours
cache
No cache10 minutes
cache
User Interface
mauroservienti
Vertical ownership
Catalog Sales Shipping Warehouse
Doc DB
+
HTTP
DB DB
back-end back-end
Web
Proxy
API
API
Proxy to
3° party
API
User Interface
composition gateway
Catalog
Handler
Sales
Handler
Shipping
Handler
Warehouse
Handler
mauroservienti
The elephant in the room
Catalog Sales Shipping Warehouse
Doc DB
+
HTTP
DB DB
back-end back-end
Web
Proxy
API
API
Proxy to
3° party
API
User Interface
composition gateway
Catalog
Handler
Sales
Handler
Shipping
Handler
Warehouse
Handler
mauroservienti
Branding
mauroservienti
Branding
• It's the technical authority owing the UI contract
• Services that want to display data implement it
• UI structure is defined as a “monolith”
mauroservienti
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">@Model.ProductDescription</h3>
</div>
<div class="panel-body">
<div>Price: @Model.ProductPrice</div>
<div>Shipping Options: @Model.ProductShippingOptions</div>
<div>Inventory: @Model.ProductInventory</div>
</div>
</div>
mauroservienti
magic
UI Composition
mauroservienti
UI Composition
•UI defines only high level structure
•Highly coupled with the presentation technology
•Branding is less important
•The more “magic” the less Branding
•Services own the whole vertical slice
mauroservienti
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">@Model.ProductDescription</h3>
</div>
<div class="panel-body">
@await Component.InvokeAsync("ProductDetailsPrice")
@await Component.InvokeAsync("ProductDetailsShippingOptions")
@await Component.InvokeAsync("ProductDetailsInventory")
</div>
</div>
mauroservienti
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">@Model.ProductDescription</h3>
</div>
<div class="panel-body">
@await Component.InvokeAsync("ProductDetailsPrice")
@await Component.InvokeAsync("ProductDetailsShippingOptions")
@await Component.InvokeAsync("ProductDetailsInventory")
</div>
</div>
mauroservienti
Catalog
Sales
Shipping
Warehouse
Full vertical ownership
mauroservienti
Catalog Sales Shipping Warehouse
Doc DB
+
HTTP
DB DB
back-end back-end
Web
Proxy
API
API
Proxy to
3° party
API
User Interface
composition gateway
Catalog
Handler
Sales
Handler
Shipping
Handler
Warehouse
Handler
Full vertical ownership
client shell
mauroservienti
Catalog
Components
Sales
Components
Shipping
Components
Warehouse
Components
Catalog Sales Shipping Warehouse
Doc DB
+
HTTP
DB DB
back-end back-end
Web
Proxy
API
API
Proxy to
3° party
API
composition gateway
Catalog
Handler
Sales
Handler
Shipping
Handler
Warehouse
Handler
Every year is getting shorter never seem to find the time…
ViewModel Composition Demos
bit.ly/dnd19-composition
Udi Dahan about Service Modelling
go.particular.net/dnd19-composition
mauroservienti
Demos: bit.ly/dnd19-composition
Videos: go.particular.net/dnd19-composition
Is it worth the effort?
• Complexity increases as “black magic” kicks in
• For large projects with a small UI team a traditional
monolithic UI approach might be better
mauroservienti
Demos: bit.ly/dnd19-composition
Videos: go.particular.net/dnd19-composition
Is it worth the effort?
• Complexity increases as “black magic” kicks in
• It’s simpler to break a monolithic UI later
• Than to manage not needed complexity
mauroservienti
Demos: bit.ly/dnd19-composition
Videos: go.particular.net/dnd19-composition
Takeaways
• Boundaries are key to success
• Do not bring in more technology to solve non-
technical problems
mauroservienti
• Boundaries are key to success
• Mental model can badly influence design
• Users/Business analysts tend to think in term
of data presentation
mauroservienti
Takeaways
Demos: bit.ly/dnd19-composition
Videos: go.particular.net/dnd19-composition
Demos: bit.ly/dnd19-composition
Videos: go.particular.net/dnd19-composition
Takeaways
• Boundaries are key to success
• Mental model can badly influence design
• Use ViewModel composition to present data
• No need for complex projections and read
models
mauroservienti
Mauro Servienti
Solution Architect @ Particular Software
the makers of NServiceBus
mauro.servienti@particular.net
@mauroservienti
//github.com/mauroservienti
//milestone.topics.it
mauroservienti
Thank you!
Join me at the Particular booth
Demos: bit.ly/dnd19-composition
Videos: go.particular.net/dnd19-composition
mauroservienti

More Related Content

Similar to Designing a ui for microservices @ .NET Day Switzerland 2019

The Web beyond "usernames & passwords" (OSDC12)
The Web beyond "usernames & passwords" (OSDC12)The Web beyond "usernames & passwords" (OSDC12)
The Web beyond "usernames & passwords" (OSDC12)
Francois Marier
 
HTML for the Mobile Web, Firefox OS - All Things Open - 2014-10-22
HTML for the Mobile Web, Firefox OS - All Things Open - 2014-10-22HTML for the Mobile Web, Firefox OS - All Things Open - 2014-10-22
HTML for the Mobile Web, Firefox OS - All Things Open - 2014-10-22
Frédéric Harper
 
HTML, not just for desktops: Firefox OS - Congreso Universitario Móvil - 201...
HTML, not just for desktops: Firefox OS - Congreso Universitario Móvil - 201...HTML, not just for desktops: Firefox OS - Congreso Universitario Móvil - 201...
HTML, not just for desktops: Firefox OS - Congreso Universitario Móvil - 201...
Frédéric Harper
 
Persona: in your browsers, killing your passwords
Persona: in your browsers, killing your passwordsPersona: in your browsers, killing your passwords
Persona: in your browsers, killing your passwords
Francois Marier
 
Always on! Or not?
Always on! Or not?Always on! Or not?
Always on! Or not?
Carsten Sandtner
 
SharePoint Cincy 2012 - jQuery essentials
SharePoint Cincy 2012 - jQuery essentialsSharePoint Cincy 2012 - jQuery essentials
SharePoint Cincy 2012 - jQuery essentials
Mark Rackley
 
Designing Secure APIs in the Cloud
Designing Secure APIs in the CloudDesigning Secure APIs in the Cloud
Designing Secure APIs in the Cloud
Postman
 
Passwords suck, but centralized proprietary services are not the answer
Passwords suck, but centralized proprietary services are not the answerPasswords suck, but centralized proprietary services are not the answer
Passwords suck, but centralized proprietary services are not the answer
Francois Marier
 
Hypermedia API’s
Hypermedia API’s Hypermedia API’s
Hypermedia API’s
3camp
 
Firefox OS: HTML5 sur les stéroïdes - HTML5mtl - 2014-04-22
Firefox OS: HTML5 sur les stéroïdes - HTML5mtl - 2014-04-22Firefox OS: HTML5 sur les stéroïdes - HTML5mtl - 2014-04-22
Firefox OS: HTML5 sur les stéroïdes - HTML5mtl - 2014-04-22
Frédéric Harper
 
jQuery Mobile Workshop
jQuery Mobile WorkshopjQuery Mobile Workshop
jQuery Mobile Workshop
Ron Reiter
 
Building Progressive Web Apps for Android and iOS
Building Progressive Web Apps for Android and iOSBuilding Progressive Web Apps for Android and iOS
Building Progressive Web Apps for Android and iOS
FITC
 
Open Social In The Enterprise
Open Social In The EnterpriseOpen Social In The Enterprise
Open Social In The Enterprise
Tim Moore
 
Need for Speed: Removing speed bumps in API Projects
Need for Speed: Removing speed bumps in API ProjectsNeed for Speed: Removing speed bumps in API Projects
Need for Speed: Removing speed bumps in API Projects
Łukasz Chruściel
 
Aplicacoes dinamicas Rails com Backbone
Aplicacoes dinamicas Rails com BackboneAplicacoes dinamicas Rails com Backbone
Aplicacoes dinamicas Rails com Backbone
Rafael Felix da Silva
 
Firefox OS, fixing the mobile web - FITC Toronto - 2014-04-28
Firefox OS, fixing the mobile web - FITC Toronto - 2014-04-28Firefox OS, fixing the mobile web - FITC Toronto - 2014-04-28
Firefox OS, fixing the mobile web - FITC Toronto - 2014-04-28
Frédéric Harper
 
The Future of the Web - Cold Front conference 2016
The Future of the Web - Cold Front conference 2016The Future of the Web - Cold Front conference 2016
The Future of the Web - Cold Front conference 2016
Robert Nyman
 
Educate 2017: Customizing Authoring: How our APIs let you create powerful sol...
Educate 2017: Customizing Authoring: How our APIs let you create powerful sol...Educate 2017: Customizing Authoring: How our APIs let you create powerful sol...
Educate 2017: Customizing Authoring: How our APIs let you create powerful sol...
Learnosity
 
Building web apps with Vaadin 8
Building web apps with Vaadin 8 Building web apps with Vaadin 8
Building web apps with Vaadin 8
Marcus Hellberg
 
Parse London Meetup - Cloud Code Tips & Tricks
Parse London Meetup - Cloud Code Tips & TricksParse London Meetup - Cloud Code Tips & Tricks
Parse London Meetup - Cloud Code Tips & Tricks
Hector Ramos
 

Similar to Designing a ui for microservices @ .NET Day Switzerland 2019 (20)

The Web beyond "usernames & passwords" (OSDC12)
The Web beyond "usernames & passwords" (OSDC12)The Web beyond "usernames & passwords" (OSDC12)
The Web beyond "usernames & passwords" (OSDC12)
 
HTML for the Mobile Web, Firefox OS - All Things Open - 2014-10-22
HTML for the Mobile Web, Firefox OS - All Things Open - 2014-10-22HTML for the Mobile Web, Firefox OS - All Things Open - 2014-10-22
HTML for the Mobile Web, Firefox OS - All Things Open - 2014-10-22
 
HTML, not just for desktops: Firefox OS - Congreso Universitario Móvil - 201...
HTML, not just for desktops: Firefox OS - Congreso Universitario Móvil - 201...HTML, not just for desktops: Firefox OS - Congreso Universitario Móvil - 201...
HTML, not just for desktops: Firefox OS - Congreso Universitario Móvil - 201...
 
Persona: in your browsers, killing your passwords
Persona: in your browsers, killing your passwordsPersona: in your browsers, killing your passwords
Persona: in your browsers, killing your passwords
 
Always on! Or not?
Always on! Or not?Always on! Or not?
Always on! Or not?
 
SharePoint Cincy 2012 - jQuery essentials
SharePoint Cincy 2012 - jQuery essentialsSharePoint Cincy 2012 - jQuery essentials
SharePoint Cincy 2012 - jQuery essentials
 
Designing Secure APIs in the Cloud
Designing Secure APIs in the CloudDesigning Secure APIs in the Cloud
Designing Secure APIs in the Cloud
 
Passwords suck, but centralized proprietary services are not the answer
Passwords suck, but centralized proprietary services are not the answerPasswords suck, but centralized proprietary services are not the answer
Passwords suck, but centralized proprietary services are not the answer
 
Hypermedia API’s
Hypermedia API’s Hypermedia API’s
Hypermedia API’s
 
Firefox OS: HTML5 sur les stéroïdes - HTML5mtl - 2014-04-22
Firefox OS: HTML5 sur les stéroïdes - HTML5mtl - 2014-04-22Firefox OS: HTML5 sur les stéroïdes - HTML5mtl - 2014-04-22
Firefox OS: HTML5 sur les stéroïdes - HTML5mtl - 2014-04-22
 
jQuery Mobile Workshop
jQuery Mobile WorkshopjQuery Mobile Workshop
jQuery Mobile Workshop
 
Building Progressive Web Apps for Android and iOS
Building Progressive Web Apps for Android and iOSBuilding Progressive Web Apps for Android and iOS
Building Progressive Web Apps for Android and iOS
 
Open Social In The Enterprise
Open Social In The EnterpriseOpen Social In The Enterprise
Open Social In The Enterprise
 
Need for Speed: Removing speed bumps in API Projects
Need for Speed: Removing speed bumps in API ProjectsNeed for Speed: Removing speed bumps in API Projects
Need for Speed: Removing speed bumps in API Projects
 
Aplicacoes dinamicas Rails com Backbone
Aplicacoes dinamicas Rails com BackboneAplicacoes dinamicas Rails com Backbone
Aplicacoes dinamicas Rails com Backbone
 
Firefox OS, fixing the mobile web - FITC Toronto - 2014-04-28
Firefox OS, fixing the mobile web - FITC Toronto - 2014-04-28Firefox OS, fixing the mobile web - FITC Toronto - 2014-04-28
Firefox OS, fixing the mobile web - FITC Toronto - 2014-04-28
 
The Future of the Web - Cold Front conference 2016
The Future of the Web - Cold Front conference 2016The Future of the Web - Cold Front conference 2016
The Future of the Web - Cold Front conference 2016
 
Educate 2017: Customizing Authoring: How our APIs let you create powerful sol...
Educate 2017: Customizing Authoring: How our APIs let you create powerful sol...Educate 2017: Customizing Authoring: How our APIs let you create powerful sol...
Educate 2017: Customizing Authoring: How our APIs let you create powerful sol...
 
Building web apps with Vaadin 8
Building web apps with Vaadin 8 Building web apps with Vaadin 8
Building web apps with Vaadin 8
 
Parse London Meetup - Cloud Code Tips & Tricks
Parse London Meetup - Cloud Code Tips & TricksParse London Meetup - Cloud Code Tips & Tricks
Parse London Meetup - Cloud Code Tips & Tricks
 

More from Mauro Servienti

Welcome to the (state) machine @ ExploreDDD 2019
Welcome to the (state) machine @ ExploreDDD 2019Welcome to the (state) machine @ ExploreDDD 2019
Welcome to the (state) machine @ ExploreDDD 2019
Mauro Servienti
 
Welcome to the (state) machine @ Xe One Day Enterprise Applications
Welcome to the (state) machine @ Xe One Day Enterprise ApplicationsWelcome to the (state) machine @ Xe One Day Enterprise Applications
Welcome to the (state) machine @ Xe One Day Enterprise Applications
Mauro Servienti
 
All our aggregates are wrong @ NDC Copenhagen 2019
All our aggregates are wrong @ NDC Copenhagen 2019All our aggregates are wrong @ NDC Copenhagen 2019
All our aggregates are wrong @ NDC Copenhagen 2019
Mauro Servienti
 
Be like water, my friend @ Agile for Innovation 2019
Be like water, my friend @ Agile for Innovation 2019Be like water, my friend @ Agile for Innovation 2019
Be like water, my friend @ Agile for Innovation 2019
Mauro Servienti
 
Microservices architecture is it the right choice to design long-living syste...
Microservices architecture is it the right choice to design long-living syste...Microservices architecture is it the right choice to design long-living syste...
Microservices architecture is it the right choice to design long-living syste...
Mauro Servienti
 
Titles, abstracts, and bio matter... oh my! @ Global Diversity CFP Day 2019
Titles, abstracts, and bio matter... oh my! @ Global Diversity CFP Day 2019Titles, abstracts, and bio matter... oh my! @ Global Diversity CFP Day 2019
Titles, abstracts, and bio matter... oh my! @ Global Diversity CFP Day 2019
Mauro Servienti
 
Living organizations, particular software @ do IT Better Parma
Living organizations, particular software @ do IT Better ParmaLiving organizations, particular software @ do IT Better Parma
Living organizations, particular software @ do IT Better Parma
Mauro Servienti
 
Welcome to the (state) machine @ Crafted Software
Welcome to the (state) machine @ Crafted SoftwareWelcome to the (state) machine @ Crafted Software
Welcome to the (state) machine @ Crafted Software
Mauro Servienti
 
PO is dead, long live the PO - Italian Agile Day 2018
PO is dead, long live the PO - Italian Agile Day 2018PO is dead, long live the PO - Italian Agile Day 2018
PO is dead, long live the PO - Italian Agile Day 2018
Mauro Servienti
 
Design a UI for your Microservices @ Do IT Better
Design a UI for your Microservices @ Do IT BetterDesign a UI for your Microservices @ Do IT Better
Design a UI for your Microservices @ Do IT Better
Mauro Servienti
 
Microservices and pineapple on pizza what do they have in common - dos and ...
Microservices and pineapple on pizza   what do they have in common - dos and ...Microservices and pineapple on pizza   what do they have in common - dos and ...
Microservices and pineapple on pizza what do they have in common - dos and ...
Mauro Servienti
 
All our aggregates are wrong (ExploreDDD 2018)
All our aggregates are wrong (ExploreDDD 2018)All our aggregates are wrong (ExploreDDD 2018)
All our aggregates are wrong (ExploreDDD 2018)
Mauro Servienti
 
Designing a ui for microservices
Designing a ui for microservicesDesigning a ui for microservices
Designing a ui for microservices
Mauro Servienti
 
Po is dead, long live the po
Po is dead, long live the poPo is dead, long live the po
Po is dead, long live the po
Mauro Servienti
 
Shipping code is not the problem, deciding what to ship it is!
Shipping code is not the problem, deciding what to ship it is!Shipping code is not the problem, deciding what to ship it is!
Shipping code is not the problem, deciding what to ship it is!
Mauro Servienti
 
GraphQL - Where are you from? Where are you going?
GraphQL - Where are you from? Where are you going?GraphQL - Where are you from? Where are you going?
GraphQL - Where are you from? Where are you going?
Mauro Servienti
 
Dall'idea al deploy un lungo viaggio che passa per git flow e semver
Dall'idea al deploy   un lungo viaggio che passa per git flow e semverDall'idea al deploy   un lungo viaggio che passa per git flow e semver
Dall'idea al deploy un lungo viaggio che passa per git flow e semver
Mauro Servienti
 
Progettare una UI per i Microservices
Progettare una UI per i MicroservicesProgettare una UI per i Microservices
Progettare una UI per i Microservices
Mauro Servienti
 
The road to a Service Oriented Architecture is paved with messages
The road to a Service Oriented Architecture is paved with messagesThe road to a Service Oriented Architecture is paved with messages
The road to a Service Oriented Architecture is paved with messages
Mauro Servienti
 
La via verso SOA è lastricata di messaggi
La via verso SOA è lastricata di messaggiLa via verso SOA è lastricata di messaggi
La via verso SOA è lastricata di messaggi
Mauro Servienti
 

More from Mauro Servienti (20)

Welcome to the (state) machine @ ExploreDDD 2019
Welcome to the (state) machine @ ExploreDDD 2019Welcome to the (state) machine @ ExploreDDD 2019
Welcome to the (state) machine @ ExploreDDD 2019
 
Welcome to the (state) machine @ Xe One Day Enterprise Applications
Welcome to the (state) machine @ Xe One Day Enterprise ApplicationsWelcome to the (state) machine @ Xe One Day Enterprise Applications
Welcome to the (state) machine @ Xe One Day Enterprise Applications
 
All our aggregates are wrong @ NDC Copenhagen 2019
All our aggregates are wrong @ NDC Copenhagen 2019All our aggregates are wrong @ NDC Copenhagen 2019
All our aggregates are wrong @ NDC Copenhagen 2019
 
Be like water, my friend @ Agile for Innovation 2019
Be like water, my friend @ Agile for Innovation 2019Be like water, my friend @ Agile for Innovation 2019
Be like water, my friend @ Agile for Innovation 2019
 
Microservices architecture is it the right choice to design long-living syste...
Microservices architecture is it the right choice to design long-living syste...Microservices architecture is it the right choice to design long-living syste...
Microservices architecture is it the right choice to design long-living syste...
 
Titles, abstracts, and bio matter... oh my! @ Global Diversity CFP Day 2019
Titles, abstracts, and bio matter... oh my! @ Global Diversity CFP Day 2019Titles, abstracts, and bio matter... oh my! @ Global Diversity CFP Day 2019
Titles, abstracts, and bio matter... oh my! @ Global Diversity CFP Day 2019
 
Living organizations, particular software @ do IT Better Parma
Living organizations, particular software @ do IT Better ParmaLiving organizations, particular software @ do IT Better Parma
Living organizations, particular software @ do IT Better Parma
 
Welcome to the (state) machine @ Crafted Software
Welcome to the (state) machine @ Crafted SoftwareWelcome to the (state) machine @ Crafted Software
Welcome to the (state) machine @ Crafted Software
 
PO is dead, long live the PO - Italian Agile Day 2018
PO is dead, long live the PO - Italian Agile Day 2018PO is dead, long live the PO - Italian Agile Day 2018
PO is dead, long live the PO - Italian Agile Day 2018
 
Design a UI for your Microservices @ Do IT Better
Design a UI for your Microservices @ Do IT BetterDesign a UI for your Microservices @ Do IT Better
Design a UI for your Microservices @ Do IT Better
 
Microservices and pineapple on pizza what do they have in common - dos and ...
Microservices and pineapple on pizza   what do they have in common - dos and ...Microservices and pineapple on pizza   what do they have in common - dos and ...
Microservices and pineapple on pizza what do they have in common - dos and ...
 
All our aggregates are wrong (ExploreDDD 2018)
All our aggregates are wrong (ExploreDDD 2018)All our aggregates are wrong (ExploreDDD 2018)
All our aggregates are wrong (ExploreDDD 2018)
 
Designing a ui for microservices
Designing a ui for microservicesDesigning a ui for microservices
Designing a ui for microservices
 
Po is dead, long live the po
Po is dead, long live the poPo is dead, long live the po
Po is dead, long live the po
 
Shipping code is not the problem, deciding what to ship it is!
Shipping code is not the problem, deciding what to ship it is!Shipping code is not the problem, deciding what to ship it is!
Shipping code is not the problem, deciding what to ship it is!
 
GraphQL - Where are you from? Where are you going?
GraphQL - Where are you from? Where are you going?GraphQL - Where are you from? Where are you going?
GraphQL - Where are you from? Where are you going?
 
Dall'idea al deploy un lungo viaggio che passa per git flow e semver
Dall'idea al deploy   un lungo viaggio che passa per git flow e semverDall'idea al deploy   un lungo viaggio che passa per git flow e semver
Dall'idea al deploy un lungo viaggio che passa per git flow e semver
 
Progettare una UI per i Microservices
Progettare una UI per i MicroservicesProgettare una UI per i Microservices
Progettare una UI per i Microservices
 
The road to a Service Oriented Architecture is paved with messages
The road to a Service Oriented Architecture is paved with messagesThe road to a Service Oriented Architecture is paved with messages
The road to a Service Oriented Architecture is paved with messages
 
La via verso SOA è lastricata di messaggi
La via verso SOA è lastricata di messaggiLa via verso SOA è lastricata di messaggi
La via verso SOA è lastricata di messaggi
 

Recently uploaded

Odoo ERP Vs. Traditional ERP Systems – A Comparative Analysis
Odoo ERP Vs. Traditional ERP Systems – A Comparative AnalysisOdoo ERP Vs. Traditional ERP Systems – A Comparative Analysis
Odoo ERP Vs. Traditional ERP Systems – A Comparative Analysis
Envertis Software Solutions
 
Malibou Pitch Deck For Its €3M Seed Round
Malibou Pitch Deck For Its €3M Seed RoundMalibou Pitch Deck For Its €3M Seed Round
Malibou Pitch Deck For Its €3M Seed Round
sjcobrien
 
ALGIT - Assembly Line for Green IT - Numbers, Data, Facts
ALGIT - Assembly Line for Green IT - Numbers, Data, FactsALGIT - Assembly Line for Green IT - Numbers, Data, Facts
ALGIT - Assembly Line for Green IT - Numbers, Data, Facts
Green Software Development
 
Hand Rolled Applicative User Validation Code Kata
Hand Rolled Applicative User ValidationCode KataHand Rolled Applicative User ValidationCode Kata
Hand Rolled Applicative User Validation Code Kata
Philip Schwarz
 
原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样
原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样
原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样
mz5nrf0n
 
Modelling Up - DDDEurope 2024 - Amsterdam
Modelling Up - DDDEurope 2024 - AmsterdamModelling Up - DDDEurope 2024 - Amsterdam
Modelling Up - DDDEurope 2024 - Amsterdam
Alberto Brandolini
 
Using Query Store in Azure PostgreSQL to Understand Query Performance
Using Query Store in Azure PostgreSQL to Understand Query PerformanceUsing Query Store in Azure PostgreSQL to Understand Query Performance
Using Query Store in Azure PostgreSQL to Understand Query Performance
Grant Fritchey
 
Energy consumption of Database Management - Florina Jonuzi
Energy consumption of Database Management - Florina JonuziEnergy consumption of Database Management - Florina Jonuzi
Energy consumption of Database Management - Florina Jonuzi
Green Software Development
 
UI5con 2024 - Keynote: Latest News about UI5 and it’s Ecosystem
UI5con 2024 - Keynote: Latest News about UI5 and it’s EcosystemUI5con 2024 - Keynote: Latest News about UI5 and it’s Ecosystem
UI5con 2024 - Keynote: Latest News about UI5 and it’s Ecosystem
Peter Muessig
 
E-commerce Development Services- Hornet Dynamics
E-commerce Development Services- Hornet DynamicsE-commerce Development Services- Hornet Dynamics
E-commerce Development Services- Hornet Dynamics
Hornet Dynamics
 
All you need to know about Spring Boot and GraalVM
All you need to know about Spring Boot and GraalVMAll you need to know about Spring Boot and GraalVM
All you need to know about Spring Boot and GraalVM
Alina Yurenko
 
GreenCode-A-VSCode-Plugin--Dario-Jurisic
GreenCode-A-VSCode-Plugin--Dario-JurisicGreenCode-A-VSCode-Plugin--Dario-Jurisic
GreenCode-A-VSCode-Plugin--Dario-Jurisic
Green Software Development
 
Artificia Intellicence and XPath Extension Functions
Artificia Intellicence and XPath Extension FunctionsArtificia Intellicence and XPath Extension Functions
Artificia Intellicence and XPath Extension Functions
Octavian Nadolu
 
316895207-SAP-Oil-and-Gas-Downstream-Training.pptx
316895207-SAP-Oil-and-Gas-Downstream-Training.pptx316895207-SAP-Oil-and-Gas-Downstream-Training.pptx
316895207-SAP-Oil-and-Gas-Downstream-Training.pptx
ssuserad3af4
 
Webinar On-Demand: Using Flutter for Embedded
Webinar On-Demand: Using Flutter for EmbeddedWebinar On-Demand: Using Flutter for Embedded
Webinar On-Demand: Using Flutter for Embedded
ICS
 
Fundamentals of Programming and Language Processors
Fundamentals of Programming and Language ProcessorsFundamentals of Programming and Language Processors
Fundamentals of Programming and Language Processors
Rakesh Kumar R
 
在线购买加拿大英属哥伦比亚大学毕业证本科学位证书原版一模一样
在线购买加拿大英属哥伦比亚大学毕业证本科学位证书原版一模一样在线购买加拿大英属哥伦比亚大学毕业证本科学位证书原版一模一样
在线购买加拿大英属哥伦比亚大学毕业证本科学位证书原版一模一样
mz5nrf0n
 
KuberTENes Birthday Bash Guadalajara - Introducción a Argo CD
KuberTENes Birthday Bash Guadalajara - Introducción a Argo CDKuberTENes Birthday Bash Guadalajara - Introducción a Argo CD
KuberTENes Birthday Bash Guadalajara - Introducción a Argo CD
rodomar2
 
Requirement Traceability in Xen Functional Safety
Requirement Traceability in Xen Functional SafetyRequirement Traceability in Xen Functional Safety
Requirement Traceability in Xen Functional Safety
Ayan Halder
 
socradar-q1-2024-aviation-industry-report.pdf
socradar-q1-2024-aviation-industry-report.pdfsocradar-q1-2024-aviation-industry-report.pdf
socradar-q1-2024-aviation-industry-report.pdf
SOCRadar
 

Recently uploaded (20)

Odoo ERP Vs. Traditional ERP Systems – A Comparative Analysis
Odoo ERP Vs. Traditional ERP Systems – A Comparative AnalysisOdoo ERP Vs. Traditional ERP Systems – A Comparative Analysis
Odoo ERP Vs. Traditional ERP Systems – A Comparative Analysis
 
Malibou Pitch Deck For Its €3M Seed Round
Malibou Pitch Deck For Its €3M Seed RoundMalibou Pitch Deck For Its €3M Seed Round
Malibou Pitch Deck For Its €3M Seed Round
 
ALGIT - Assembly Line for Green IT - Numbers, Data, Facts
ALGIT - Assembly Line for Green IT - Numbers, Data, FactsALGIT - Assembly Line for Green IT - Numbers, Data, Facts
ALGIT - Assembly Line for Green IT - Numbers, Data, Facts
 
Hand Rolled Applicative User Validation Code Kata
Hand Rolled Applicative User ValidationCode KataHand Rolled Applicative User ValidationCode Kata
Hand Rolled Applicative User Validation Code Kata
 
原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样
原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样
原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样
 
Modelling Up - DDDEurope 2024 - Amsterdam
Modelling Up - DDDEurope 2024 - AmsterdamModelling Up - DDDEurope 2024 - Amsterdam
Modelling Up - DDDEurope 2024 - Amsterdam
 
Using Query Store in Azure PostgreSQL to Understand Query Performance
Using Query Store in Azure PostgreSQL to Understand Query PerformanceUsing Query Store in Azure PostgreSQL to Understand Query Performance
Using Query Store in Azure PostgreSQL to Understand Query Performance
 
Energy consumption of Database Management - Florina Jonuzi
Energy consumption of Database Management - Florina JonuziEnergy consumption of Database Management - Florina Jonuzi
Energy consumption of Database Management - Florina Jonuzi
 
UI5con 2024 - Keynote: Latest News about UI5 and it’s Ecosystem
UI5con 2024 - Keynote: Latest News about UI5 and it’s EcosystemUI5con 2024 - Keynote: Latest News about UI5 and it’s Ecosystem
UI5con 2024 - Keynote: Latest News about UI5 and it’s Ecosystem
 
E-commerce Development Services- Hornet Dynamics
E-commerce Development Services- Hornet DynamicsE-commerce Development Services- Hornet Dynamics
E-commerce Development Services- Hornet Dynamics
 
All you need to know about Spring Boot and GraalVM
All you need to know about Spring Boot and GraalVMAll you need to know about Spring Boot and GraalVM
All you need to know about Spring Boot and GraalVM
 
GreenCode-A-VSCode-Plugin--Dario-Jurisic
GreenCode-A-VSCode-Plugin--Dario-JurisicGreenCode-A-VSCode-Plugin--Dario-Jurisic
GreenCode-A-VSCode-Plugin--Dario-Jurisic
 
Artificia Intellicence and XPath Extension Functions
Artificia Intellicence and XPath Extension FunctionsArtificia Intellicence and XPath Extension Functions
Artificia Intellicence and XPath Extension Functions
 
316895207-SAP-Oil-and-Gas-Downstream-Training.pptx
316895207-SAP-Oil-and-Gas-Downstream-Training.pptx316895207-SAP-Oil-and-Gas-Downstream-Training.pptx
316895207-SAP-Oil-and-Gas-Downstream-Training.pptx
 
Webinar On-Demand: Using Flutter for Embedded
Webinar On-Demand: Using Flutter for EmbeddedWebinar On-Demand: Using Flutter for Embedded
Webinar On-Demand: Using Flutter for Embedded
 
Fundamentals of Programming and Language Processors
Fundamentals of Programming and Language ProcessorsFundamentals of Programming and Language Processors
Fundamentals of Programming and Language Processors
 
在线购买加拿大英属哥伦比亚大学毕业证本科学位证书原版一模一样
在线购买加拿大英属哥伦比亚大学毕业证本科学位证书原版一模一样在线购买加拿大英属哥伦比亚大学毕业证本科学位证书原版一模一样
在线购买加拿大英属哥伦比亚大学毕业证本科学位证书原版一模一样
 
KuberTENes Birthday Bash Guadalajara - Introducción a Argo CD
KuberTENes Birthday Bash Guadalajara - Introducción a Argo CDKuberTENes Birthday Bash Guadalajara - Introducción a Argo CD
KuberTENes Birthday Bash Guadalajara - Introducción a Argo CD
 
Requirement Traceability in Xen Functional Safety
Requirement Traceability in Xen Functional SafetyRequirement Traceability in Xen Functional Safety
Requirement Traceability in Xen Functional Safety
 
socradar-q1-2024-aviation-industry-report.pdf
socradar-q1-2024-aviation-industry-report.pdfsocradar-q1-2024-aviation-industry-report.pdf
socradar-q1-2024-aviation-industry-report.pdf
 

Designing a ui for microservices @ .NET Day Switzerland 2019

Editor's Notes

  1. I’m a remote worker We live in a small flat, thus I have a small office I enjoy going to the office by bike And I enjoy bananas for my breaks Bike riding and bananas in the backpack are not a great idea, so…
  2. While showing ownership in overlay....Lots of components, or in SOA lingo services, each one owing different data. Otherwise it's a clear violation of responsibilities.
  3. It's very tempting to design a technical solution
  4. It's very tempting to design a technical solution
  5. It's very tempting to design a technical solution
  6. It's very tempting to design a technical solution
  7. It's very tempting to design a technical solution
  8. It's very tempting to design a technical solution
  9. It's very tempting to design a technical solution
  10. No scatter/gather Too many messages
  11. No scatter/gather Too many messages