initial commit
This commit is contained in:
@@ -0,0 +1,40 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" itemscope itemtype="https://schema.org/Article">
|
||||
<head>
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-G9G5HP50VK"></script><script>window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments);}gtag('js',new Date());gtag('config','G-G9G5HP50VK');</script>
|
||||
<meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Vertical Slice Architecture vs Traditional Layered Architecture: Side-by-Side Code | Indotalent Blog</title>
|
||||
<meta name="description" content="7 files in 4 projects vs 1 file. A concrete code comparison of VSA and traditional layered architecture for the same 'Create Customer' feature." />
|
||||
<meta name="robots" content="index, follow" />
|
||||
<link rel="canonical" href="https://www.indotalent.com/blog/vsa-vs-layered-architecture.html" />
|
||||
<link rel="icon" type="image/x-icon" href="../favicon.ico" />
|
||||
<script type="application/ld+json">{ "@context":"https://schema.org","@type":"Article","headline":"Vertical Slice Architecture vs Traditional Layered Architecture: Side-by-Side Code","author":{"@type":"Person","name":"go2ismail"},"datePublished":"2026-02-01","publisher":{"@type":"Organization","name":"Indotalent"}}</script>
|
||||
<script type="application/ld+json">{ "@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{ "@type":"ListItem","position":1,"name":"Home","item":"https://www.indotalent.com/" },{ "@type":"ListItem","position":2,"name":"Blog","item":"https://www.indotalent.com/blog/" },{ "@type":"ListItem","position":3,"name":"VSA vs Layered Architecture","item":"https://www.indotalent.com/blog/vsa-vs-layered-architecture.html" }]}</script>
|
||||
<script src="https://cdn.tailwindcss.com"></script><script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js"></script>
|
||||
<script>tailwind.config={theme:{extend:{colors:{brand:{50:'#fff7ed',100:'#ffedd5',200:'#fed7aa',300:'#fdba74',400:'#fb923c',500:'#f97316',600:'#ea580c',700:'#c2410c'}},fontFamily:{sans:['Inter','system-ui','sans-serif']}}}}</script>
|
||||
<style>.nav-blur{backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px)}.gradient-text{background:linear-gradient(135deg,#f97316,#ea580c);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}.btn-primary{display:inline-flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#f97316,#ea580c);color:#fff;font-weight:600;border-radius:12px;padding:12px 24px;transition:all 0.2s;box-shadow:0 4px 14px -4px rgba(249,115,22,0.35);text-decoration:none}article h2{font-size:1.5rem;font-weight:700;margin:1.75rem 0 0.75rem;color:#111827}article p{font-size:0.95rem;line-height:1.8;color:#4b5563;margin-bottom:1rem}article code{background:#f3f4f6;padding:2px 6px;border-radius:4px;font-size:0.85rem;color:#ea580c}article ul{list-style:disc;padding-left:1.5rem;margin-bottom:1rem}article ul li{font-size:0.95rem;line-height:1.8;color:#4b5563}</style>
|
||||
</head>
|
||||
<body class="bg-white text-gray-900 antialiased">
|
||||
<nav aria-label="Breadcrumb" class="pt-20 bg-white border-b border-gray-100"><div class="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 py-2.5"><ol class="flex items-center gap-1.5 text-xs text-gray-400"><li><a href="../index.html" class="hover:text-brand-500">Home</a></li><li><span class="text-gray-300">/</span></li><li><a href="index.html" class="hover:text-brand-500">Blog</a></li><li><span class="text-gray-300">/</span></li><li><span class="text-gray-600 font-medium">VSA vs Layered</span></li></ol></div></nav>
|
||||
<nav class="fixed top-0 left-0 right-0 z-50 nav-blur bg-white/85 border-b border-gray-200/60"><div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"><div class="flex items-center justify-between h-16"><a href="../index.html" class="flex items-center gap-2.5"><img src="../img/logo-indotalent-dark.svg" alt="Indotalent" class="h-8 w-auto" /></a><div class="hidden lg:flex items-center gap-6"><a href="../index.html#products" class="text-sm font-medium text-gray-600 hover:text-brand-500">Products</a><a href="../for-beginners.html" class="text-sm font-medium text-gray-600 hover:text-brand-500">Beginners</a><a href="../for-freelancers.html" class="text-sm font-medium text-gray-600 hover:text-brand-500">Freelancers</a><a href="index.html" class="text-sm font-medium text-brand-600">Blog</a></div></div></div></nav>
|
||||
<section class="pt-24 pb-10 lg:pt-32 lg:pb-12"><div class="max-w-3xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="flex items-center gap-2 mb-3"><span class="text-xs font-semibold bg-amber-50 text-amber-700 border border-amber-200 rounded-full px-2.5 py-0.5">VSA</span><span class="text-xs text-gray-400">Feb 2026 · 8 min read</span></div>
|
||||
<h1 class="text-3xl sm:text-4xl font-extrabold text-gray-900 mb-4">Vertical Slice Architecture vs Traditional Layered Architecture: Side-by-Side Code</h1>
|
||||
<div class="bg-green-50 border border-green-200 rounded-xl p-4 mb-8"><p class="text-sm text-green-800 font-semibold mb-1">TL;DR</p><p class="text-sm text-green-700">Traditional approach: 7 files across 4 projects for one feature. VSA: 1 file in 1 folder. Same functionality, zero cognitive overhead for VSA.</p></div>
|
||||
<article>
|
||||
<p>Let's compare how the same "Create Customer" feature looks in both architectures.</p>
|
||||
<h2>Traditional Layered Approach</h2>
|
||||
<p>Files you must touch across a typical Clean Architecture solution:</p>
|
||||
<ul><li><code>Controllers/CustomersController.cs</code> — HTTP endpoint</li><li><code>Application/Customers/CreateCustomerCommand.cs</code> — DTO</li><li><code>Application/Customers/CreateCustomerHandler.cs</code> — business logic</li><li><code>Application/Common/Interfaces/IAppDbContext.cs</code> — abstraction</li><li><code>Domain/Entities/Customer.cs</code> — domain entity</li><li><code>Infrastructure/Persistence/AppDbContext.cs</code> — EF Core context</li><li><code>Web/Program.cs</code> — DI registration</li></ul>
|
||||
<p>Seven files across four projects. When a bug is reported in customer creation, you must trace the flow through all of them.</p>
|
||||
<h2>VSA Approach</h2>
|
||||
<p>One file in one folder <code>Features/Customers/CreateCustomer.cs</code> contains: the Minimal API endpoint, the MediatR command, the handler with all business logic, the EF Core query, and the response DTO. When a bug is reported, you open one file. When you need to add a field to customer creation, you edit one file. This is the essence of VSA: <strong>maximum cohesion, minimum scattering</strong>.</p>
|
||||
<h2>Key Takeaways</h2>
|
||||
<ul><li>Layered: 7 files, 4 projects. VSA: 1 file, 1 folder.</li><li>Bug tracing: hours vs minutes</li><li>Feature addition: touch 7 files vs touch 1 file</li><li>All Indotalent products demonstrate this VSA pattern in production code</li></ul>
|
||||
</article>
|
||||
<div class="mt-10 p-6 bg-gradient-to-r from-orange-50 to-amber-50 border border-orange-200 rounded-2xl"><p class="text-sm text-gray-700 font-semibold mb-2">Compare with Indotalent VSA code</p><p class="text-sm text-gray-600 mb-4">Every product demonstrates VSA in a real, working application. $21 each.</p><a href="../index.html#products" class="btn-primary text-sm">Explore Products</a></div>
|
||||
<div class="mt-6"><a href="index.html" class="text-sm text-brand-600 hover:text-brand-700">← Back to Blog</a></div>
|
||||
</div></section>
|
||||
<footer class="bg-white border-t border-gray-200"><div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-10"><div class="flex flex-col md:flex-row items-center justify-between gap-4"><a href="../index.html" class="flex items-center gap-2"><img src="../img/logo-indotalent-dark.svg" alt="Indotalent" class="h-5 w-auto" /></a><p class="text-xs text-gray-500">© 2024-2026 Indotalent. <span class="text-brand-500">♥</span> by go2ismail</p></div></div></footer>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user