Inhoudsopgave

Clean Vertical Slice Architecture

Wanneer goed geΓ―mplementeerd, vertonen Clean Architecture en Vertical Slice Architecture opvallende overeenkomsten. Onenigheden tussen voor en tegenstanders ontstaan vaak door misverstanden in plaats van door gebreken in de concepten.

Kritiek op Clean Architecture:

Zijn deze kritieken werkelijk op Clean Architecture gericht, of eerder een gevolg van een slechte package cohesion strategie?

Clean Architecture

Slechte Clean Architecture

Veel implementatie- en projecttemplates hebben de neiging om classes te categoriseren op type, wat lijkt op de bekende structuur van MVC-projecttemplates.

MySolution.sln
  πŸ“‚ MyCompany.MyProject.Api
    πŸ“‚ Controllers
      πŸ“„ AccountController.cs
      πŸ“„ OrderController.cs
  πŸ“‚ MyCompany.MyProject.Application
    πŸ“‚ Interfaces
      πŸ“„ IAccountRepository.cs
      πŸ“„ IAccountService.cs
      πŸ“„ IOrderRepository.cs
      πŸ“„ IOrderService.cs
    πŸ“‚ Services
      πŸ“„ AccountService.cs
      πŸ“„ OrderService.cs
    πŸ“‚ Validators
      πŸ“„ AccountValidator.cs
      πŸ“„ OrderValidator.cs
  πŸ“‚ MyCompany.MyProject.Domain
    πŸ“„ Account.cs
    πŸ“„ Order.cs
  πŸ“‚ MyCompany.MyProject.Infrastructure
    πŸ“„ AccountRepository.cs
    πŸ“„ OrderRepository.cs

Navigeren door verschillende mappen om de Order-functionaliteit aan te passen is omslachtig. Deze simplistische organisatorische benadering, hoewel aanvankelijk intuΓ―tief, faalt om effectief te schalen. Het is als het opslaan van alle sokken in één ladeβ€”geschikt voor één persoon maar onpraktisch voor een groter huishouden.

Ik wed dat je je sokken scheidt van die van je partner, en dat elk van je kinderen de sokken in zijn of haar eigen kamer heeft opgeslagen.

Betere clean architecture

MySolution.sln
  πŸ“‚ MyCompany.MyProject.Api
    πŸ“‚ Controllers
      πŸ“„ AccountController.cs
      πŸ“„ OrderController.cs
  πŸ“‚ MyCompany.MyProject.Application
    πŸ“‚ Accounts
      πŸ“„ Account.cs
      πŸ“„ AccountService.cs
      πŸ“„ AccountValidator.cs
      πŸ“„ IAccountRepository.cs  
      πŸ“„ IAccountService.cs
    πŸ“‚ Orders
      πŸ“„ IOrderRepository.cs
      πŸ“„ IOrderService.cs
      πŸ“„ Order.cs
      πŸ“„ OrderService.cs
      πŸ“„ OrderValidator.cs  
  πŸ“‚ MyCompany.MyProject.Infrastructure
    πŸ“„ AccountRepository.cs
    πŸ“„ OrderRepository.cs

Bepaalde details zijn staan open voor discussie en kunnen variΓ«ren afhankelijk van de specifieke kenmerken van je applicatie. Bijvoorbeeld:

Vertical Slice Architecture komt voor uit een goed ontworpen Clean Architecture.

Vertical Slice Architecture

Wat dacht je van het integreren van AccountRepository.cs in de Accounts-map? Zeker. En de AccountController.cs? Het samenvoegen zou de architectuur niet wijzigen.

Extreme Vertical Slice Architecture

MySolution.sln   
  πŸ“‚ MyCompany.MyProject.Api
    πŸ“‚ Accounts
      πŸ“„ Account.cs
      πŸ“„ AccountController.cs
      πŸ“„ AccountRepository.cs
      πŸ“„ AccountService.cs
      πŸ“„ AccountValidator.cs
      πŸ“„ IAccountRepository.cs  
      πŸ“„ IAccountService.cs
    πŸ“‚ Orders
      πŸ“„ IOrderRepository.cs
      πŸ“„ IOrderService.cs
      πŸ“„ Order.cs
      πŸ“„ OrderController.cs
      πŸ“„ OrderRepository.cs
      πŸ“„ OrderService.cs
      πŸ“„ OrderValidator.cs   

Het is belangrijk om afhankelijkheden zo ver mogelijk naar de rand van je applicatie te duwen. Het voorkomen dat webgerelateerde elementen doordringen in services of databasedetails validators besmetten, is van het grootste belang.

Sommige implementaties van Vertical Slice Architecture falen echter wanneer de architectuur het niet ontmoedigd om code op de verkeerde plekt te plaatsen.Externe afhankelijkheden zoals ORM en web frameworks kunnen onbedoeld de kernapplicatielogica binnendringen, wat leidt tot koppeling van bedrijfslogica aan implementatiedetails.

Vertical Slice Clean Architecture

Het gebruik van een mappenstructuur kan helpen om de onderscheidingen te verduidelijken. Waardoor de oplossing weer geleidelijk op Clean Architecture begint te lijken.

MySolution.sln   
  πŸ“‚ MyCompany.MyProject.Api
    πŸ“‚ Accounts
      πŸ“‚ Presentation
        πŸ“„ AccountController.cs
      πŸ“‚ Core 
        πŸ“„ Account.cs      
        πŸ“„ AccountService.cs
        πŸ“„ AccountValidator.cs
        πŸ“„ IAccountRepository.cs  
        πŸ“„ IAccountService.cs
      πŸ“‚ Infrastructure
        πŸ“„ AccountRepository.cs

Afzonderlijke projecten zijn te verkiezen om het gebruik van externe afhankelijkheden binnen de kern van de applicatie te voorkomen.

Clean vs Vertical Slice Architectures

Wanneer je goed kijkt, beginnen Clean en Vertical Slice Architecture als twee handen op één buik te lijken. Ze streven beide naar modulaire, flexibele ontwerpen die gemakkelijk te onderhouden en schalen zijn. De kleine verschillen komen voornamelijk neer op hoe ze in de praktijk worden gebracht. Wanneer je ze goed implementeert, eindig je met software die gemakkelijk te gebruiken, aanpasbaar en betrouwbaar is.

Referenties

Β© 2024 Rob van der Velden. Alle rechten voorbehouden.