mirror of
https://github.com/meysamhadeli/booking-microservices.git
synced 2026-04-27 16:10:52 +08:00
Merge pull request #218 from meysamhadeli/develop
chore: Update diagram vertical slice architecture
This commit is contained in:
commit
4a1c655e53
@ -119,7 +119,7 @@ When adding or changing a feature in an application in n-tire architecture, we a
|
|||||||
|
|
||||||
With this approach, each of our vertical slices can decide for itself how to best fulfill the request. New features only add code, we're not changing shared code and worrying about side effects.
|
With this approach, each of our vertical slices can decide for itself how to best fulfill the request. New features only add code, we're not changing shared code and worrying about side effects.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
Instead of grouping related action methods in one controller, as found in traditional ASP.net controllers, I used the [REPR pattern](https://deviq.com/design-patterns/repr-design-pattern). Each action gets its own small endpoint, consisting of a route, the action, and an `IMediator` instance (see [MediatR](https://github.com/jbogard/MediatR)). The request is passed to the `IMediator` instance, routed through a [`Mediatr pipeline`](https://lostechies.com/jimmybogard/2014/09/09/tackling-cross-cutting-concerns-with-a-mediator-pipeline/) where custom [middleware](https://github.com/jbogard/MediatR/wiki/Behaviors) can log, validate and intercept requests. The request is then handled by a request specific `IRequestHandler` which performs business logic before returning the result.
|
Instead of grouping related action methods in one controller, as found in traditional ASP.net controllers, I used the [REPR pattern](https://deviq.com/design-patterns/repr-design-pattern). Each action gets its own small endpoint, consisting of a route, the action, and an `IMediator` instance (see [MediatR](https://github.com/jbogard/MediatR)). The request is passed to the `IMediator` instance, routed through a [`Mediatr pipeline`](https://lostechies.com/jimmybogard/2014/09/09/tackling-cross-cutting-concerns-with-a-mediator-pipeline/) where custom [middleware](https://github.com/jbogard/MediatR/wiki/Behaviors) can log, validate and intercept requests. The request is then handled by a request specific `IRequestHandler` which performs business logic before returning the result.
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 30 KiB |
431
assets/vertical-slice-architecture.excalidraw
Normal file
431
assets/vertical-slice-architecture.excalidraw
Normal file
@ -0,0 +1,431 @@
|
|||||||
|
{
|
||||||
|
"type": "excalidraw",
|
||||||
|
"version": 2,
|
||||||
|
"source": "https://excalidraw.com",
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"id": "80OGzNPG6Gk8NAvbV3XaF",
|
||||||
|
"type": "rectangle",
|
||||||
|
"x": 648,
|
||||||
|
"y": 187,
|
||||||
|
"width": 538,
|
||||||
|
"height": 62,
|
||||||
|
"angle": 0,
|
||||||
|
"strokeColor": "#000000",
|
||||||
|
"backgroundColor": "#5dade2",
|
||||||
|
"fillStyle": "solid",
|
||||||
|
"strokeWidth": 1,
|
||||||
|
"strokeStyle": "solid",
|
||||||
|
"roughness": 1,
|
||||||
|
"opacity": 70,
|
||||||
|
"groupIds": [],
|
||||||
|
"roundness": {
|
||||||
|
"type": 3
|
||||||
|
},
|
||||||
|
"seed": 246982778,
|
||||||
|
"version": 236,
|
||||||
|
"versionNonce": 69633510,
|
||||||
|
"isDeleted": false,
|
||||||
|
"boundElements": [
|
||||||
|
{
|
||||||
|
"type": "text",
|
||||||
|
"id": "46GLDhDwmnc8RGy3v8OK8"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"updated": 1677440080893,
|
||||||
|
"link": null,
|
||||||
|
"locked": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "46GLDhDwmnc8RGy3v8OK8",
|
||||||
|
"type": "text",
|
||||||
|
"x": 897.848014831543,
|
||||||
|
"y": 201.2,
|
||||||
|
"width": 38.30397033691406,
|
||||||
|
"height": 33.6,
|
||||||
|
"angle": 0,
|
||||||
|
"strokeColor": "#000000",
|
||||||
|
"backgroundColor": "transparent",
|
||||||
|
"fillStyle": "hachure",
|
||||||
|
"strokeWidth": 1,
|
||||||
|
"strokeStyle": "solid",
|
||||||
|
"roughness": 1,
|
||||||
|
"opacity": 70,
|
||||||
|
"groupIds": [],
|
||||||
|
"roundness": null,
|
||||||
|
"seed": 2080176422,
|
||||||
|
"version": 133,
|
||||||
|
"versionNonce": 467252090,
|
||||||
|
"isDeleted": false,
|
||||||
|
"boundElements": null,
|
||||||
|
"updated": 1677440080893,
|
||||||
|
"link": null,
|
||||||
|
"locked": false,
|
||||||
|
"text": "Api",
|
||||||
|
"fontSize": 28,
|
||||||
|
"fontFamily": 1,
|
||||||
|
"textAlign": "center",
|
||||||
|
"verticalAlign": "middle",
|
||||||
|
"containerId": "80OGzNPG6Gk8NAvbV3XaF",
|
||||||
|
"originalText": "Api"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "rectangle",
|
||||||
|
"version": 339,
|
||||||
|
"versionNonce": 2033133178,
|
||||||
|
"isDeleted": false,
|
||||||
|
"id": "nZuYK7wbLObwRvpRRLHay",
|
||||||
|
"fillStyle": "solid",
|
||||||
|
"strokeWidth": 1,
|
||||||
|
"strokeStyle": "solid",
|
||||||
|
"roughness": 1,
|
||||||
|
"opacity": 70,
|
||||||
|
"angle": 0,
|
||||||
|
"x": 648,
|
||||||
|
"y": 263,
|
||||||
|
"strokeColor": "#000000",
|
||||||
|
"backgroundColor": "#ced4da",
|
||||||
|
"width": 538,
|
||||||
|
"height": 62,
|
||||||
|
"seed": 287502970,
|
||||||
|
"groupIds": [],
|
||||||
|
"roundness": {
|
||||||
|
"type": 3
|
||||||
|
},
|
||||||
|
"boundElements": [
|
||||||
|
{
|
||||||
|
"type": "text",
|
||||||
|
"id": "OALII-DXtatRPgn_EkHfp"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"updated": 1677440080893,
|
||||||
|
"link": null,
|
||||||
|
"locked": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "text",
|
||||||
|
"version": 242,
|
||||||
|
"versionNonce": 1368921638,
|
||||||
|
"isDeleted": false,
|
||||||
|
"id": "OALII-DXtatRPgn_EkHfp",
|
||||||
|
"fillStyle": "hachure",
|
||||||
|
"strokeWidth": 1,
|
||||||
|
"strokeStyle": "solid",
|
||||||
|
"roughness": 1,
|
||||||
|
"opacity": 70,
|
||||||
|
"angle": 0,
|
||||||
|
"x": 845.628044128418,
|
||||||
|
"y": 277.2,
|
||||||
|
"strokeColor": "#000000",
|
||||||
|
"backgroundColor": "transparent",
|
||||||
|
"width": 142.74391174316406,
|
||||||
|
"height": 33.6,
|
||||||
|
"seed": 1016531494,
|
||||||
|
"groupIds": [],
|
||||||
|
"roundness": null,
|
||||||
|
"boundElements": null,
|
||||||
|
"updated": 1677440080893,
|
||||||
|
"link": null,
|
||||||
|
"locked": false,
|
||||||
|
"fontSize": 28,
|
||||||
|
"fontFamily": 1,
|
||||||
|
"text": "Application",
|
||||||
|
"textAlign": "center",
|
||||||
|
"verticalAlign": "middle",
|
||||||
|
"containerId": "nZuYK7wbLObwRvpRRLHay",
|
||||||
|
"originalText": "Application"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "rectangle",
|
||||||
|
"version": 271,
|
||||||
|
"versionNonce": 1144538938,
|
||||||
|
"isDeleted": false,
|
||||||
|
"id": "za_4vz64MSfPF5TWmD7wj",
|
||||||
|
"fillStyle": "solid",
|
||||||
|
"strokeWidth": 1,
|
||||||
|
"strokeStyle": "solid",
|
||||||
|
"roughness": 1,
|
||||||
|
"opacity": 70,
|
||||||
|
"angle": 0,
|
||||||
|
"x": 650,
|
||||||
|
"y": 338,
|
||||||
|
"strokeColor": "#000000",
|
||||||
|
"backgroundColor": "#fa5252",
|
||||||
|
"width": 538,
|
||||||
|
"height": 62,
|
||||||
|
"seed": 676018342,
|
||||||
|
"groupIds": [],
|
||||||
|
"roundness": {
|
||||||
|
"type": 3
|
||||||
|
},
|
||||||
|
"boundElements": [
|
||||||
|
{
|
||||||
|
"type": "text",
|
||||||
|
"id": "6CqYCSOKHqhqJ8nf4b-Sv"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"updated": 1677440080893,
|
||||||
|
"link": null,
|
||||||
|
"locked": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "text",
|
||||||
|
"version": 185,
|
||||||
|
"versionNonce": 1874747750,
|
||||||
|
"isDeleted": false,
|
||||||
|
"id": "6CqYCSOKHqhqJ8nf4b-Sv",
|
||||||
|
"fillStyle": "hachure",
|
||||||
|
"strokeWidth": 1,
|
||||||
|
"strokeStyle": "solid",
|
||||||
|
"roughness": 1,
|
||||||
|
"opacity": 70,
|
||||||
|
"angle": 0,
|
||||||
|
"x": 816.618049621582,
|
||||||
|
"y": 352.2,
|
||||||
|
"strokeColor": "#000000",
|
||||||
|
"backgroundColor": "transparent",
|
||||||
|
"width": 204.76390075683594,
|
||||||
|
"height": 33.6,
|
||||||
|
"seed": 1067355322,
|
||||||
|
"groupIds": [],
|
||||||
|
"roundness": null,
|
||||||
|
"boundElements": null,
|
||||||
|
"updated": 1677440080893,
|
||||||
|
"link": null,
|
||||||
|
"locked": false,
|
||||||
|
"fontSize": 28,
|
||||||
|
"fontFamily": 1,
|
||||||
|
"text": "Infrastructure",
|
||||||
|
"textAlign": "center",
|
||||||
|
"verticalAlign": "middle",
|
||||||
|
"containerId": "za_4vz64MSfPF5TWmD7wj",
|
||||||
|
"originalText": "Infrastructure"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "rectangle",
|
||||||
|
"version": 323,
|
||||||
|
"versionNonce": 987713530,
|
||||||
|
"isDeleted": false,
|
||||||
|
"id": "t2sZwLLvmq3y2ndIbEomB",
|
||||||
|
"fillStyle": "solid",
|
||||||
|
"strokeWidth": 1,
|
||||||
|
"strokeStyle": "solid",
|
||||||
|
"roughness": 1,
|
||||||
|
"opacity": 70,
|
||||||
|
"angle": 0,
|
||||||
|
"x": 648,
|
||||||
|
"y": 413,
|
||||||
|
"strokeColor": "#000000",
|
||||||
|
"backgroundColor": "#58ccae",
|
||||||
|
"width": 538,
|
||||||
|
"height": 62,
|
||||||
|
"seed": 1173221990,
|
||||||
|
"groupIds": [],
|
||||||
|
"roundness": {
|
||||||
|
"type": 3
|
||||||
|
},
|
||||||
|
"boundElements": [
|
||||||
|
{
|
||||||
|
"type": "text",
|
||||||
|
"id": "b3wdaWjaVmgHpzMD26uKD"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"updated": 1677440080893,
|
||||||
|
"link": null,
|
||||||
|
"locked": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "text",
|
||||||
|
"version": 223,
|
||||||
|
"versionNonce": 1635337382,
|
||||||
|
"isDeleted": false,
|
||||||
|
"id": "b3wdaWjaVmgHpzMD26uKD",
|
||||||
|
"fillStyle": "hachure",
|
||||||
|
"strokeWidth": 1,
|
||||||
|
"strokeStyle": "solid",
|
||||||
|
"roughness": 1,
|
||||||
|
"opacity": 70,
|
||||||
|
"angle": 0,
|
||||||
|
"x": 886.5500106811523,
|
||||||
|
"y": 427.2,
|
||||||
|
"strokeColor": "#000000",
|
||||||
|
"backgroundColor": "transparent",
|
||||||
|
"width": 60.89997863769531,
|
||||||
|
"height": 33.6,
|
||||||
|
"seed": 1307397882,
|
||||||
|
"groupIds": [],
|
||||||
|
"roundness": null,
|
||||||
|
"boundElements": null,
|
||||||
|
"updated": 1677440080893,
|
||||||
|
"link": null,
|
||||||
|
"locked": false,
|
||||||
|
"fontSize": 28,
|
||||||
|
"fontFamily": 1,
|
||||||
|
"text": "Core",
|
||||||
|
"textAlign": "center",
|
||||||
|
"verticalAlign": "middle",
|
||||||
|
"containerId": "t2sZwLLvmq3y2ndIbEomB",
|
||||||
|
"originalText": "Core"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "FQZImjU2-VUOATU9Yeyly",
|
||||||
|
"type": "rectangle",
|
||||||
|
"x": 678,
|
||||||
|
"y": 154,
|
||||||
|
"width": 48,
|
||||||
|
"height": 361,
|
||||||
|
"angle": 0,
|
||||||
|
"strokeColor": "#000000",
|
||||||
|
"backgroundColor": "#f9e79f",
|
||||||
|
"fillStyle": "solid",
|
||||||
|
"strokeWidth": 1,
|
||||||
|
"strokeStyle": "solid",
|
||||||
|
"roughness": 1,
|
||||||
|
"opacity": 100,
|
||||||
|
"groupIds": [],
|
||||||
|
"roundness": {
|
||||||
|
"type": 3
|
||||||
|
},
|
||||||
|
"seed": 1254939642,
|
||||||
|
"version": 185,
|
||||||
|
"versionNonce": 19349690,
|
||||||
|
"isDeleted": false,
|
||||||
|
"boundElements": [],
|
||||||
|
"updated": 1677440080893,
|
||||||
|
"link": null,
|
||||||
|
"locked": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "rectangle",
|
||||||
|
"version": 224,
|
||||||
|
"versionNonce": 1119033722,
|
||||||
|
"isDeleted": false,
|
||||||
|
"id": "_Vw9EnXAyzxRDEzXCTfeL",
|
||||||
|
"fillStyle": "solid",
|
||||||
|
"strokeWidth": 1,
|
||||||
|
"strokeStyle": "solid",
|
||||||
|
"roughness": 1,
|
||||||
|
"opacity": 100,
|
||||||
|
"angle": 0,
|
||||||
|
"x": 743,
|
||||||
|
"y": 153.5,
|
||||||
|
"strokeColor": "#000000",
|
||||||
|
"backgroundColor": "#f9e79f",
|
||||||
|
"width": 48,
|
||||||
|
"height": 361,
|
||||||
|
"seed": 523058342,
|
||||||
|
"groupIds": [],
|
||||||
|
"roundness": {
|
||||||
|
"type": 3
|
||||||
|
},
|
||||||
|
"boundElements": null,
|
||||||
|
"updated": 1677440080893,
|
||||||
|
"link": null,
|
||||||
|
"locked": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "hyJiOwPt7LFndn5R0xgfL",
|
||||||
|
"type": "text",
|
||||||
|
"x": 637.1248451774691,
|
||||||
|
"y": 317.9455509364301,
|
||||||
|
"width": 130.73194885253906,
|
||||||
|
"height": 33.6,
|
||||||
|
"angle": 4.707547804955119,
|
||||||
|
"strokeColor": "#000000",
|
||||||
|
"backgroundColor": "#f9e79f",
|
||||||
|
"fillStyle": "solid",
|
||||||
|
"strokeWidth": 1,
|
||||||
|
"strokeStyle": "solid",
|
||||||
|
"roughness": 1,
|
||||||
|
"opacity": 70,
|
||||||
|
"groupIds": [],
|
||||||
|
"roundness": null,
|
||||||
|
"seed": 678740006,
|
||||||
|
"version": 245,
|
||||||
|
"versionNonce": 1220596518,
|
||||||
|
"isDeleted": false,
|
||||||
|
"boundElements": null,
|
||||||
|
"updated": 1677440080893,
|
||||||
|
"link": null,
|
||||||
|
"locked": false,
|
||||||
|
"text": "Feature 1",
|
||||||
|
"fontSize": 28,
|
||||||
|
"fontFamily": 1,
|
||||||
|
"textAlign": "left",
|
||||||
|
"verticalAlign": "top",
|
||||||
|
"containerId": null,
|
||||||
|
"originalText": "Feature 1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "text",
|
||||||
|
"version": 179,
|
||||||
|
"versionNonce": 1053153850,
|
||||||
|
"isDeleted": false,
|
||||||
|
"id": "7KOHd5JA_wVMmwXPVT1N3",
|
||||||
|
"fillStyle": "solid",
|
||||||
|
"strokeWidth": 1,
|
||||||
|
"strokeStyle": "solid",
|
||||||
|
"roughness": 1,
|
||||||
|
"opacity": 70,
|
||||||
|
"angle": 4.7123889803846915,
|
||||||
|
"x": 695.6880416870117,
|
||||||
|
"y": 313.20000000000005,
|
||||||
|
"strokeColor": "#000000",
|
||||||
|
"backgroundColor": "#f9e79f",
|
||||||
|
"width": 143.07994079589844,
|
||||||
|
"height": 33.6,
|
||||||
|
"seed": 1387191482,
|
||||||
|
"groupIds": [],
|
||||||
|
"roundness": null,
|
||||||
|
"boundElements": null,
|
||||||
|
"updated": 1677440080893,
|
||||||
|
"link": null,
|
||||||
|
"locked": false,
|
||||||
|
"fontSize": 28,
|
||||||
|
"fontFamily": 1,
|
||||||
|
"text": "Feature 2",
|
||||||
|
"textAlign": "left",
|
||||||
|
"verticalAlign": "top",
|
||||||
|
"containerId": null,
|
||||||
|
"originalText": "Feature 2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "SuFNrbzZGowiIybusnadN",
|
||||||
|
"type": "text",
|
||||||
|
"x": 748,
|
||||||
|
"y": 96,
|
||||||
|
"width": 360.47186279296875,
|
||||||
|
"height": 33.6,
|
||||||
|
"angle": 0,
|
||||||
|
"strokeColor": "#000000",
|
||||||
|
"backgroundColor": "#f9e79f",
|
||||||
|
"fillStyle": "solid",
|
||||||
|
"strokeWidth": 1,
|
||||||
|
"strokeStyle": "solid",
|
||||||
|
"roughness": 1,
|
||||||
|
"opacity": 70,
|
||||||
|
"groupIds": [],
|
||||||
|
"roundness": null,
|
||||||
|
"seed": 2006173690,
|
||||||
|
"version": 162,
|
||||||
|
"versionNonce": 1556577894,
|
||||||
|
"isDeleted": false,
|
||||||
|
"boundElements": null,
|
||||||
|
"updated": 1677440080893,
|
||||||
|
"link": null,
|
||||||
|
"locked": false,
|
||||||
|
"text": "Vertical Slice Architecture",
|
||||||
|
"fontSize": 28,
|
||||||
|
"fontFamily": 1,
|
||||||
|
"textAlign": "left",
|
||||||
|
"verticalAlign": "top",
|
||||||
|
"containerId": null,
|
||||||
|
"originalText": "Vertical Slice Architecture"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"appState": {
|
||||||
|
"gridSize": null,
|
||||||
|
"viewBackgroundColor": "#ffffff"
|
||||||
|
},
|
||||||
|
"files": {}
|
||||||
|
}
|
||||||
BIN
assets/vertical-slice-architecture.png
Normal file
BIN
assets/vertical-slice-architecture.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 69 KiB |
Loading…
x
Reference in New Issue
Block a user