Modern yazılım geliştirme süreçlerinde veri yönetimi ve uygulama mimarisi kritik bir rol oynar.

EF Core ve CQRS (Command Query Responsibility Segregation) Uygulamaları

Giriş

Modern yazılım geliştirme süreçlerinde veri yönetimi ve uygulama mimarisi kritik bir rol oynar. Özellikle karmaşık uygulamalarda, performansı artırmak ve kodun sürdürülebilirliğini sağlamak için belirli tasarım desenleri kullanılır. Bu tasarım desenlerinden biri de CQRS (Command Query Responsibility Segregation) modelidir. EF Core ile CQRS modelini birlikte kullanarak daha yapılandırılmış ve ölçeklenebilir bir uygulama oluşturabilirsiniz. Bu makalede, CQRS modelinin temel prensipleri ve EF Core ile nasıl uygulanabileceği detaylı bir şekilde ele alınacaktır.


CQRS Nedir?

CQRS, komutların (Commands) ve sorguların (Queries) ayrı işlenmesi prensibine dayanan bir tasarım desenidir. Bu modelde:

  • Command (Komut): Veritabanında bir değişiklik yapan işlemleri temsil eder (örneğin, ekleme, güncelleme veya silme).

  • Query (Sorgu): Veritabanından veri okuma işlemlerini temsil eder. Sorgular sadece veri döner, herhangi bir değişiklik yapmaz.

Bu ayrımın temel amacı, okuma ve yazma işlemlerini birbirinden ayırarak kodun daha kolay yönetilebilir ve optimize edilebilir olmasını sağlamaktır.

EF Core Nedir?

EF Core, Microsoft tarafından geliştirilmiş bir ORM (Object Relational Mapping) aracıdır. EF Core, nesneler ve ilişkisel veritabanları arasındaki ilişkiyi yöneterek veritabanı işlemlerini kolaylaştırır. CQRS modelini EF Core ile birlikte kullanarak güçlü bir veri erişim katmanı oluşturabilirsiniz.


CQRS Modelinin Avantajları

  1. Kodun Netliği: Komutlar ve sorgular ayrı sınıflarda tanımlandığından, her bir işlem daha kolay anlaşılır ve yönetilir.

  2. Performans Artışı: Okuma ve yazma işlemleri farklı şekillerde optimize edilebilir.

  3. Test Edilebilirlik: Komutlar ve sorgular birbirinden bağımsız olduğu için birim testler daha kolay yazılabilir.

  4. Ölçeklenebilirlik: Okuma ve yazma işlemleri farklı veri depolarında bile çalıştırılabilir.


EF Core ile CQRS Uygulama Adımları

1. Proje Yapısının Hazırlanması

CQRS uygulaması için proje yapısını aşağıdaki gibi organize edebilirsiniz:

- Application
  - Commands
    - CreateOrderCommand.cs
    - UpdateOrderCommand.cs
  - Queries
    - GetOrdersQuery.cs
    - GetOrderByIdQuery.cs
- Infrastructure
  - Data
    - ApplicationDbContext.cs
- Domain
  - Entities
    - Order.cs
- API

2. Entity Tanımı

namespace Domain.Entities
{
    public class Order
    {
        public int Id { get; set; }
        public string CustomerName { get; set; }
        public DateTime OrderDate { get; set; }
        public decimal TotalAmount { get; set; }
    }
}

3. EF Core DbContext Sınıfı

using Domain.Entities;
using Microsoft.EntityFrameworkCore;

namespace Infrastructure.Data
{
    public class ApplicationDbContext : DbContext
    {
        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { }

        public DbSet<Order> Orders { get; set; }
    }
}

4. Komutlar (Commands)

CreateOrderCommand:

namespace Application.Commands
{
    public class CreateOrderCommand
    {
        public string CustomerName { get; set; }
        public DateTime OrderDate { get; set; }
        public decimal TotalAmount { get; set; }
    }
}

CreateOrderCommandHandler:

using Infrastructure.Data;
using Domain.Entities;

namespace Application.Commands
{
    public class CreateOrderCommandHandler
    {
        private readonly ApplicationDbContext _context;

        public CreateOrderCommandHandler(ApplicationDbContext context)
        {
            _context = context;
        }

        public async Task Handle(CreateOrderCommand command)
        {
            var order = new Order
            {
                CustomerName = command.CustomerName,
                OrderDate = command.OrderDate,
                TotalAmount = command.TotalAmount
            };

            _context.Orders.Add(order);
            await _context.SaveChangesAsync();
        }
    }
}

5. Sorgular (Queries)

GetOrdersQuery:

namespace Application.Queries
{
    public class GetOrdersQuery
    {
    }
}

GetOrdersQueryHandler:

using Infrastructure.Data;
using Domain.Entities;
using Microsoft.EntityFrameworkCore;

namespace Application.Queries
{
    public class GetOrdersQueryHandler
    {
        private readonly ApplicationDbContext _context;

        public GetOrdersQueryHandler(ApplicationDbContext context)
        {
            _context = context;
        }

        public async Task<List<Order>> Handle(GetOrdersQuery query)
        {
            return await _context.Orders.ToListAsync();
        }
    }
}

API Katmanı

EF Core ile CQRS uygulamak için bir Web API oluşturabilirsiniz. Örnek bir Controller aşağıdaki gibi tanımlanabilir:

using Application.Commands;
using Application.Queries;
using Microsoft.AspNetCore.Mvc;

namespace API.Controllers
{
    [ApiController]
    [Route("api/[controller]")]
    public class OrdersController : ControllerBase
    {
        private readonly CreateOrderCommandHandler _createHandler;
        private readonly GetOrdersQueryHandler _getHandler;

        public OrdersController(CreateOrderCommandHandler createHandler, GetOrdersQueryHandler getHandler)
        {
            _createHandler = createHandler;
            _getHandler = getHandler;
        }

        [HttpPost]
        public async Task<IActionResult> Create([FromBody] CreateOrderCommand command)
        {
            await _createHandler.Handle(command);
            return Ok();
        }

        [HttpGet]
        public async Task<IActionResult> GetAll()
        {
            var orders = await _getHandler.Handle(new GetOrdersQuery());
            return Ok(orders);
        }
    }
}

Sonuç

EF Core ve CQRS modelini birlikte kullanarak hem performansı optimize edebilir hem de kodunuzu daha sürdürülebilir bir hale getirebilirsiniz. CQRS ile okuma ve yazma işlemlerinin ayrıştırılması, özellikle büyük ölçekli projelerde düzen ve netlik sağlar. Bu makalede verilen adımları takip ederek kendi projelerinizde bu yaklaşımı uygulayabilirsiniz.

 

İlgili Makaleler

Bu yazıya 0 yorum yapılmış.

Yorum Gönder