The Simplest Vertical Slice Architecture With .NET 8

Ғылым және технология

Get the source code for this video for FREE → the-dotnet-weekly.ck.page/vsa...
Want to master Clean Architecture? Go here: bit.ly/3PupkOJ
Want to unlock Modular Monoliths? Go here: bit.ly/3SXlzSt
Join a community of 1000+ .NET developers: / milanjovanovic
Are you tired of organizing your project across layers? Vertical Slice Architecture is a compelling alternative to traditional layered architectures. VSA flips the script on how we structure code. Instead of horizontal layers (Presentation, Application, Domain), VSA organizes code by feature. Each feature encompasses everything it needs, from API endpoints to data access. In this video, we will explore how you can structure vertical slices in VSA.
Vertical Slice Architecture
www.milanjovanovic.tech/blog/...
Vertical Slice Architecture: Structuring Vertical Slices
www.milanjovanovic.tech/blog/...
Check out my courses:
www.milanjovanovic.tech/courses
Read my Blog here:
www.milanjovanovic.tech/blog
Join my weekly .NET newsletter:
www.milanjovanovic.tech
Chapters
0:00 Understanding Vertical Slice Architecture
4:53 Implementing a simple Vertical Slice
8:53 Extending the Vertical Slice with validation
11:15 Adding more Vertical Slices to the example

Пікірлер: 78

  • @MilanJovanovicTech
    @MilanJovanovicTech19 күн бұрын

    Get the source code for this video for FREE → the-dotnet-weekly.ck.page/vsa-structure Want to master Clean Architecture? Go here: bit.ly/3PupkOJ Want to unlock Modular Monoliths? Go here: bit.ly/3SXlzSt

  • @olivier0003
    @olivier000320 күн бұрын

    Hi Milan, you produce so many interesting videos, that it takes all my day to view all of them !

  • @MilanJovanovicTech

    @MilanJovanovicTech

    20 күн бұрын

    Glad you like them!

  • @Fikusiklol
    @Fikusiklol16 күн бұрын

    Great stuff, Milan and also much congratz on getting MVP :) As for the video, I, personally, prefer using Clean + Vertical at the same time for non-crud apps, separating slices (folders basically) between projects. I.e "Products" folder in all projects. With enough dedication and discipline you can get best of both worlds. Great example anyway and love your approach with IEndpoint reflection stuff :)

  • @MilanJovanovicTech

    @MilanJovanovicTech

    15 күн бұрын

    Thank you! I'm doing something similar to what you are when using CA. Works great.

  • @nikolaknezevic2117
    @nikolaknezevic211720 күн бұрын

    Great video! I hope you consider creating a full video on sharing code between slices. Code duplication can be a challenging, it would be nice to see different strategies for reducing duplication.

  • @MilanJovanovicTech

    @MilanJovanovicTech

    20 күн бұрын

    Yes, that's something I want to tackle

  • @petropzqi
    @petropzqi20 күн бұрын

    Thank you so much

  • @MilanJovanovicTech

    @MilanJovanovicTech

    20 күн бұрын

    Any time! :)

  • @fritzjimenez9109
    @fritzjimenez910920 күн бұрын

    pretty simple and straight forward 🤔👍

  • @MilanJovanovicTech

    @MilanJovanovicTech

    20 күн бұрын

    Thanks! :)

  • @jawadsrour8490
    @jawadsrour849020 күн бұрын

    Great video! A nice video you could do: - best practices C#12 - Best practices .NET 8 (top X best practices in general)… - Doing some talks on clean code…

  • @MilanJovanovicTech

    @MilanJovanovicTech

    19 күн бұрын

    Great suggestions 👌

  • @YoelQuintanaCarrera
    @YoelQuintanaCarrera16 күн бұрын

    Excellent video as always!!!!.

  • @MilanJovanovicTech

    @MilanJovanovicTech

    16 күн бұрын

    I appreciate that

  • @timur2887
    @timur288719 күн бұрын

    Great, thanks!

  • @MilanJovanovicTech

    @MilanJovanovicTech

    19 күн бұрын

    You bet!

  • @davood7497
    @davood749717 күн бұрын

    Good Job !

  • @MilanJovanovicTech

    @MilanJovanovicTech

    17 күн бұрын

    Thanks!

  • @kodindoyannick5328
    @kodindoyannick53285 күн бұрын

    Wonderful video. Thanks much!

  • @MilanJovanovicTech

    @MilanJovanovicTech

    4 күн бұрын

    Thank you too!

  • @drhdev
    @drhdev20 күн бұрын

    Could you do a video on Owned Properties vs EF's new Complex Types and the nuances between them?

  • @MilanJovanovicTech

    @MilanJovanovicTech

    20 күн бұрын

    I did: kzread.info/dash/bejne/fpx3ppd8hba2Zso.html

  • @drhdev

    @drhdev

    20 күн бұрын

    @@MilanJovanovicTechawesome thank you!

  • @GordonKenaston
    @GordonKenaston20 күн бұрын

    I like it! 🎉

  • @MilanJovanovicTech

    @MilanJovanovicTech

    20 күн бұрын

    Awesome!

  • @cas818028
    @cas81802820 күн бұрын

    Something else that nobody has mentioned, it’s super easy to Wrap the entire slice in a feature flag. Which opens door for a ton of flexible development options.

  • @MilanJovanovicTech

    @MilanJovanovicTech

    20 күн бұрын

    Okay, I'm liking the suggestion

  • @ajdinhusic2574
    @ajdinhusic257420 күн бұрын

    Hi Milan, thanks for the great video! I have a question though. Is there a purpose for putting the different components inside a static class (effectively the REPR pattern), as opposed to putting it in a namespace? And then reference it in the same way if you like, i.e. CreateProduct.Request, etc.. ?

  • @MilanJovanovicTech

    @MilanJovanovicTech

    20 күн бұрын

    Less verbose: - CreateProduct.Request/CreateProduct.Response - As opposed to CreateProductRequest/CreateProductResponse I can use simpler names within the vertical slice, where these types matter

  • @ajdinhusic2574

    @ajdinhusic2574

    19 күн бұрын

    @@MilanJovanovicTech I was thinking slightly different, calling the types still the same names, but in a folder, so: CreateProduct/ - Request.cs - Response.cs etc.

  • @krccmsitp2884
    @krccmsitp288420 күн бұрын

    I like your approach.

  • @MilanJovanovicTech

    @MilanJovanovicTech

    20 күн бұрын

    Thanks

  • @krccmsitp2884

    @krccmsitp2884

    20 күн бұрын

    @@MilanJovanovicTech do you combine DDD with Vertical Slices, eg subdomain = slice?

  • @MilanJovanovicTech

    @MilanJovanovicTech

    20 күн бұрын

    @@krccmsitp2884 Most likely, yes. I'll expand on this in future videos and we can discuss possible approaches.

  • @krccmsitp2884

    @krccmsitp2884

    20 күн бұрын

    @@MilanJovanovicTech great!

  • @alessandrohudson5221
    @alessandrohudson522120 күн бұрын

    Hey Milan, Thank you for sharing this resource to us. However, a have a doubt: I have an entity named "Item" in selling and stock context, and if I understood well this entity can does move with cross-cutting. In this case, will are through of domain events? For example, I sold a guitar and I need to update my stock, can I create a domain event to update it?

  • @Ry4nWTF

    @Ry4nWTF

    20 күн бұрын

    to me this sounds super clean. instead of injecting a StockService or StockRepo, and all the other parts of the system that needs that info

  • @MilanJovanovicTech

    @MilanJovanovicTech

    20 күн бұрын

    Of course, this doesn't exclude using domain events or any other pattern

  • @arteqppp6223
    @arteqppp622320 күн бұрын

    I'm really interested in how to structure entities and their configurations in vertical slice. Should I place these two in same folder as my request command handler and response classes? Or maybe place them in different folders?

  • @MilanJovanovicTech

    @MilanJovanovicTech

    20 күн бұрын

    Place them next to the DbContext? VSA is more about organizing around business capabilities. EF Core configurations are a minor concern.

  • @MjwAllMusic
    @MjwAllMusic19 күн бұрын

    Could you make a video about the best practices with multithreading, async, etc?

  • @MilanJovanovicTech

    @MilanJovanovicTech

    19 күн бұрын

    Adding to my topic list 👌

  • @ruekkart
    @ruekkart20 күн бұрын

    Nice, finally I can see a good and complete VSA example! Just one question, how would you suggest using this for gRPC, given that you need to handle proto files?

  • @MilanJovanovicTech

    @MilanJovanovicTech

    20 күн бұрын

    That's a technical concern. Maybe I should do a VSA + gRPC video?

  • @ruekkart

    @ruekkart

    20 күн бұрын

    @@MilanJovanovicTech that'd be awesome, please 😃

  • @mehdi-vl5nn
    @mehdi-vl5nn11 күн бұрын

    I do have a hard time understanding what 'use case' implies here! Is 'use case' in the sense of requirements, as it exists in RUP? If yes, that would end up being a class diagram. However, it seems the meaning of 'use case' is different in the context of CA

  • @MilanJovanovicTech

    @MilanJovanovicTech

    11 күн бұрын

    A use case represents a unique piece of functionality in the system. Copy-paste from Uncle Bob's article: --- Use Cases The software in this layer contains application specific business rules. It encapsulates and implements all of the use cases of the system. These use cases orchestrate the flow of data to and from the entities, and direct those entities to use their enterprise wide business rules to achieve the goals of the use case. We do not expect changes in this layer to affect the entities. We also do not expect this layer to be affected by changes to externalities such as the database, the UI, or any of the common frameworks. This layer is isolated from such concerns. We do, however, expect that changes to the operation of the application will affect the use-cases and therefore the software in this layer. If the details of a use-case change, then some code in this layer will certainly be affected. ---

  • @IAmFeO2x
    @IAmFeO2x20 күн бұрын

    Interesting approach - but is this really feasible when things get more complicated? Would you organize a more complex project this way? I organize my vertical slices in a hierarchical folder structure - this scaled well for me so far.

  • @MilanJovanovicTech

    @MilanJovanovicTech

    20 күн бұрын

    Projects don't start out complicated (most of the time). They become complicated. So this is a great way to start any project, and restructure as your project grows.

  • @IAmFeO2x

    @IAmFeO2x

    20 күн бұрын

    @@MilanJovanovicTech OK, thanks for your response. I'd still recommend to start right with folders as no subsequent switch is required as the project grows.

  • @burakkizilkaya5271
    @burakkizilkaya527118 күн бұрын

    Thank you for your videos. I like the vertical slice architecture. What do you think about organising vertical slice architecture with multiple "mains" like a WebAPI project and a console project. The core should be the same on both. How do you structure such a project? My answer is to make the core vertical slice architecture and the multiple main project are implementend like the hexagonal architecture which access the public interface of the core.

  • @MilanJovanovicTech

    @MilanJovanovicTech

    17 күн бұрын

    MediatR solves this pretty easily 😅

  • @burakkizilkaya5271

    @burakkizilkaya5271

    16 күн бұрын

    @@MilanJovanovicTech my question is how to structure such projects.

  • @HernanIannella
    @HernanIannella20 күн бұрын

    What visual studio theme is that?

  • @MilanJovanovicTech

    @MilanJovanovicTech

    20 күн бұрын

    ReSharper

  • @ducaipham1248
    @ducaipham124820 күн бұрын

    can you compare vertical slice with clean architecture?

  • @MilanJovanovicTech

    @MilanJovanovicTech

    20 күн бұрын

    Yes

  • @Ziirf
    @Ziirf16 күн бұрын

    I like the idea of vertical slice architecture. I am just worried how it would work in a large repo.

  • @MilanJovanovicTech

    @MilanJovanovicTech

    15 күн бұрын

    You can evolve it into anything more strict later

  • @simonklein2335
    @simonklein233520 күн бұрын

    Great Video like always :D You mentioned to map the validation result to a ProblemDetails and currently I am trying to that with the Results pattern. So map the Errors in a Result to a ProblemDetails, but I am failing misserably. Could you make a video on that, where you show, how to map the Errors of a Result to ProblemDetails within minimal API. I know it's fairly easy to that with MVC controllers, but MinimalAPI gives me a headache. My use case is that I am validating business logic and want to return custom errors. So for example CreateProducts validates if the product already exists and if it exists return Result.Fail("custom message with error details). And I want to map the Error to a problem details within minimalAPI. The controller would return something like this: return response.IsSucess ? Results.Ok() : Results.BadRequest(response.error)

  • @MilanJovanovicTech

    @MilanJovanovicTech

    19 күн бұрын

    I talked about it here: kzread.info/dash/bejne/i3Z_m5Wgm6q4mps.html

  • @lucifer-5ybtn
    @lucifer-5ybtn18 күн бұрын

    theme name??

  • @MilanJovanovicTech

    @MilanJovanovicTech

    18 күн бұрын

    ReSharper

  • @Tabgyn
    @Tabgyn20 күн бұрын

    Is it just me that swagger there are no operations defined in the spec using this approach?

  • @MilanJovanovicTech

    @MilanJovanovicTech

    20 күн бұрын

    Probably, Minimal APIs are a bit limited with Swagger

  • @Bennevisie
    @Bennevisie20 күн бұрын

    Hi Milan. This is great, but it can be even simpler. You don't need the repository layer (just use Dapper and DbUp).

  • @drhdev

    @drhdev

    20 күн бұрын

    Is the repository layer in the room with us right now?

  • @Ry4nWTF

    @Ry4nWTF

    20 күн бұрын

    @@drhdev years of overusing repo layers has fried this guys mind

  • @ppenxhchqlz3113

    @ppenxhchqlz3113

    20 күн бұрын

    @@drhdev HAHAHHAHAHHA

  • @MilanJovanovicTech

    @MilanJovanovicTech

    20 күн бұрын

    EF Core is simple enough for me

  • @Sharondevbd
    @Sharondevbd20 күн бұрын

    Brother Need some interview ques & ans to Crack .Net Jobs

  • @MilanJovanovicTech

    @MilanJovanovicTech

    20 күн бұрын

    Ok sure

  • @BlindVirtuoso
    @BlindVirtuoso20 күн бұрын

    Nice, but I didn't like the tip on refactoring out code duplication to a shared component. That's a premature abstraction and introduces unnecessary coupling between vertical slices. What I mean is that today's duplicate parts probably evolve in different directions in the future.

  • @MilanJovanovicTech

    @MilanJovanovicTech

    20 күн бұрын

    That's something to be decided by the developers

Келесі