Vertical Slice Architecture
Vertical Slice Architecture bir uygulama katmanlarını dikey kesitlere ayırarak her bir işlevi kendi diliminde(slice) bağımsız oluşturmayı temel alan bir yaklaşımdır.

Erdoğancan Yüksel
1 dakika 43 saniye okuma süresi

Vertical Slice Architecture

Erdoğancan Yüksel
1 dakika 43 saniye okuma süresi
Vertical Slice Architecture bir uygulama katmanlarını dikey kesitlere ayırarak her bir işlevi kendi diliminde(slice) bağımsız oluşturmayı temel alan bir yaklaşımdır.

Vertical Slice Architecture yaklaşımı, web uygulaması geliştirirken çoğunlukla kullanmaya alışkın olduğumuz yatay katmanlı mimarinin aksine katman yaklaşımını dikey olarak bölmektedir. Her bir işlem kendi komut (Command), işleyici (Handler), doğrulayıcı (Validator) ve endpoint'ine sahip tekil bir yapı şekildedir.
Vertical Slice Architecture yaklaşımı genellike CQRS (Command-Query Responsibility Segregation) ile birlikte kullanılmakta olup her bir dilim (slice) birbirinden bağımsızdır.
Vertical Slice Architecture yaklaşımının avantajları ve dezavantajları şu şekilde sıralanabilir:
Avantajları:- Her özellik (feature) kendi bağımsız yapısında olduğu için diğer özelliklere bağlılık azalmaktadır. Bu da paralel geliştirmeye olanak sağlamaktadır.
- Özellikle büyük proje yapılarında dosyalama olarak sadeleşme sağlamaktadır.
- Her dilimi bağımsız olarak test etmek mümkün olduğu için test yazımını kolaylaştırmaktadır.
- Klasik yatay katmanlı mimari anlayışından farklı olduğu için dikey yapıya alışma süreci olabilmektedir.
- Küçük projelerde uygulandığında gereğinden fazla ayrışma gibi görünebilir. Bu nedenle büyük projelerde kullanmak avantaj kazandırmaktadır.
- Her bir özellik birbirinden bağımsız olduğu için bazı durumlarda kod tekrarı ihtimali olabilmektedir.
Vertical Slice Architecture .NET Core ile Birlikte Uygulanması
Features/Users/CreateUser.cs adında bir sınıf oluşturalım ve içerisine Command, Validator, Handler ve endpoint alanlarını ekleyelim:
// CreateUser vertical slice
public static class CreateUser
{
public class Command : IRequest<int>
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
public string Email { get; set; }
public Gender Gender { get; set; }
}
public class Validator : AbstractValidator<Command>
{
public Validator()
{
RuleFor(c => c.FirstName).NotEmpty();
RuleFor(c => c.LastName).NotEmpty();
RuleFor(c => c.Age).GreaterThan(0);
}
}
internal sealed class Handler(ExampleApplicationDbContext context, IValidator<Command> validator) : IRequestHandler<Command, int>
{
public async Task<int> Handle(Command request, CancellationToken cancellationToken)
{
var validationResult = validator.Validate(request);
if (!validationResult.IsValid)
throw new Exception(validationResult.ToString());
var user = new User(request.FirstName, request.LastName, request.Age, request.Email, request.Gender);
context.Add(user);
await context.SaveChangesAsync(cancellationToken);
return user.Id;
}
}
public static void MapEndpoint(this IEndpointRouteBuilder app)
{
app.MapPost("api/user", async (Command command, ISender sender) =>
{
var userId = await sender.Send(command);
return Results.Ok(userId);
});
}
}
Yukarıdaki kod örneğini incelediğimizde:
- Command: İstek modelini tanımlamaktadır.
- Handler: İsteği işlemek için gerekli olan iş mantığını içermektedir.
- Validator: FluentValidation kullanarak istek doğrulaması yapılmıştır.
- Endpoint: Minimal API endpoint tanımı yapılmıştır.
Sonuç olarak Vertical Slice Architecture modern .NET uygulamaları geliştirmek isteyen yazılım geliştiricileri için güçlü bir alternatiftir. Katmanlı mimarideki bağımlılık kargaşasını ortadan kaldırarak birbirinden bağımsız özellik(feature) odaklı bir yazılım geliştirme deneyimi sunmaktadır. Daha okunabilir ve kolay test edilebilir bir yapı geliştirmek isteyen geliştiriciler için Vertical Slice Architecture yaklaşımı güzel bir seçenek olabilmektedir.
Vertical Slice Architecture yaşlaşımı kullanılarak .NET 8 ile geliştirilmiş basit bir CRUD projesi örneğini incelemek için Github üzerinden inceleyebilirsiniz: