Merge pull request #218 from meysamhadeli/develop

chore: Update diagram vertical slice architecture
This commit is contained in:
Meysam Hadeli 2023-02-26 23:10:13 +03:30 committed by GitHub
commit 4a1c655e53
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 432 additions and 1 deletions

View File

@ -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.
![](./assets/Vertical-Slice-Architecture.jpg)
![](./assets/vertical-slice-architecture.png)
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

View 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": {}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB