IRONSOFTWAREHOME
GELIŞTIRICI GÜNCELLEMELERI

CQRS Pattern C# (Geliştiriciler için Nasıl Çalışır)

Jacob Mellor, Teknoloji Direktörü @ Team Iron
Jacob Mellor
Updated: 21 Nisan 2026

CQRS'ye Giriş

CQRS Komut Sorgu Sorumluluk Ayrımı anlamına gelir. Veri okuma ve yazma işlemlerinin ayrılmasına odaklanan bir kalıptır. Bu ayrımın birkaç önemli nedeni vardır. İlk olarak, her bir işlemin daha esnek optimizasyonuna izin verir, böylece uygulama performansını ve ölçeklenebilirliğini artırır. Komutları (yazma) ve sorguları (okuma) ayırdığınızda, bunları bağımsız bir şekilde optimize edebilirsiniz.

Örneğin, karmaşık bir uygulama hızlı okuma işlemleri gerektirebilir ancak daha yavaş yazma işlemlerine tolerans gösterebilir. CQRS'yi uygulayarak, geliştiriciler okuma ve yazma işlemleri için farklı veri modelleri kullanabilir, veri erişim katmanını her bir işlemin özel ihtiyaçlarına uygun hale getirecek şekilde ayırabilirler. Bu makalede, CQRS modelinin kavramlarını ve *IronPDF kütüphanesini .NET geliştiricileri için keşfedeceğiz.

Çekirdek Kavramlar ve Bileşenler

CQRS'nin kalbi, veri etkileşiminin farklı yönlerini ele alan komut ve sorgu işlemlerinin ayrılmasında yatar. Bu bileşenlerin anlaşılması, modeli etkili bir şekilde uygulamak için hayati önem taşır.

  • Komutlar: Bunlar, veriyi güncellemekten sorumludur. Komutlar karmaşık iş mantığını bünyesinde barındırır ve herhangi bir bilgi geri döndürmeden veri deposundaki verinin durumunu değiştirebilir. Komutlar, yazma veri görevlerini yürütmenin münhasır rolünü üstlenir, uygulama durumunu doğrudan etkiler ancak hiçbir çıktı vermez. Örneğin, yeni bir kullanıcı ekleme veya mevcut bir ürünün ayrıntılarını güncelleme işlemleri komutlar tarafından gerçekleştirilir.

  • Sorgular: Bir sorgu yöneticisi tarafından yönetilen sorgular, sistemin durumunu değiştirmeden veriyi veya veri aktarım nesnelerini alır. Verileriniz hakkında sorduğunuz sorulardır. Örneğin, bir kullanıcının profilini getirmek veya envanterde mevcut tüm ürünleri listelemek sorgulardır. Sorgular veriyi geri döndürür ancak veriyi veya durumunu değiştirmediklerinden emin olur.

.NET uygulamalarında CQRS'yi uygulamak için yaygın kullanılan araçlardan biri, bir arabulucu desen kütüphanesi olan MediatR'dır. Uygulamanın bileşenleri arasındaki bağı azaltmaya yardımcı olur, bu sayede bunların dolaylı olarak iletişim kurmalarını sağlar. MediatR, komutlar ve sorgular arasında arabuluculuk yaparak komutun/sorgunun ve onun yöneticisinin ele alınmasını kolaylaştırır.

ASP.NET Core ile Pratik Uygulama

CQRS modelini ASP.NET Core'da uygulamak, proje ayarlarını yapmak ve aralarındaki arabuluculuk yapmak için MediatR gibi bir kütüphane kullanarak komutları ve sorguları ayırmak anlamına gelir. ASP.NET Core uygulamanızda CQRS'yi nasıl kurabileceğinizin basitleştirilmiş bir genel özeti.

Adım 1: ASP.NET Uygulamanızı Kurun

  1. Visual Studio'yu başlatın ve yeni bir proje oluşturmayı seçin.

  2. "ASP.NET Core Web Uygulaması" proje türünü arayın ve seçin. İleri'ye tıklayın.

    CQRS Pattern C# (Geliştiriciler İçin Nasıl Çalışır): Şekil 1 - Yeni bir ASP.NET projesi oluşturma

  3. Projenize bir ad verin ve konumunu ayarlayın. Oluştur'a tıklayın.

  4. ASP.NET Core için "Web Uygulaması (Model-Görünüm-Denetleyici)" şablonunu seçin. Gereksinimlerinize uygun olan .NET Core sürümünü hedeflediğinizden emin olun. Oluştur'a tıklayın.

Adım 2

Sonrasında, projenizi CQRS için organize etmeye yöneleceksiniz. Bunu, emirlere, sorgulara ve kullanacakları ortak ara yüzlere ayırmak için klasörler ekleyerek yapabilirsiniz. Çözüm Gezgini'nde, projenize sağ tıklayın, "Ekle"ye gidin, ardından "Yeni Klasör"ü seçin. Üç klasör oluşturun: "Commands", "Queries" ve "Interfaces".

"Interfaces" klasöründe, komutlarınız ve sorgularınız için ara yüzler ekleyin. Bir komut için, bir komutu alarak ve işlemi gerçekleştiren bir "Handle" yöntemine sahip bir ICommandHandler ara yüzüne sahip olabilirsiniz. Bir sorgu için, bir sorgu alarak ve veri döndüren bir IQueryHandler ara yüzüne sahip olabilirsiniz.

CQRS Pattern C# (Geliştiriciler İçin Nasıl Çalışır): Şekil 2 - Dosyaların nasıl düzenlenebileceğine dair örnek

Adım 3

Şimdi, demonstra etmek için bir komut ve sorgu ekleyelim. Varsayalım ki uygulamanız görevleri yönetiyor ve bir görev eklemek (komut) ve görevleri geri almak (sorgu) istiyorsunuz.

"Interfaces" klasörüne iki ara yüz ekleyin:

// Define interfaces for your handlers:
public interface ICommandHandler<TCommand>
{
    void Handle(TCommand command);
}

public interface IQueryHandler<TQuery, TResult>
{
    TResult Handle(TQuery query);
}

"Commands" klasörüne, görev ayrıntıları için özellikler içeren bir AddItemCommand sınıfı ekleyin. Ayrıca, ICommandHandler uygulayan ve veritabanına bir görev ekleme mantığını içeren bir AddItemCommandHandler sınıfı ekleyin.

"Queries" klasörüne, görevler için bir istek temsil eden bir GetTasksQuery sınıfı ekleyin. IQueryHandler uygulayan ve veritabanından görevleri geri alma mantığını içeren bir başka GetTasksQueryHandler sınıfı ekleyin.

Basit bir örnek için, AddItemCommandiniz şöyle görünebilir:

public class AddItemCommand
{
    public string Name { get; set; }
    public int Quantity { get; set; }

    // Constructor
    public AddItemCommand(string name, int quantity)
    {
        Name = name;
        Quantity = quantity;
    }
}

Ve AddItemCommandHandler:

public class AddItemCommandHandler : ICommandHandler<AddItemCommand>
{
    public void Handle(AddItemCommand command)
    {
        // Here, you'd add the item to your database, for example, to have employee data stored
        Console.WriteLine($"Adding item: {command.Name} with quantity {command.Quantity}");
        // Add database logic here
    }
}

Eğer görevleri almak için herhangi bir parametreye ihtiyaç duyulmazsa GetItemsQuery boş olabilir ve GetItemsQueryHandler şu şekilde görünebilir:

public class GetItemsQuery
{
    // This class might not need any properties, depending on your query
}

namespace CQRS_testing.Queries
{
    using CQRS_testing.Interfaces;

    public class GetItemsQueryHandler : IQueryHandler<GetItemsQuery, IEnumerable<string>>
    {
        public IEnumerable<string> Handle(GetItemsQuery query)
        {
            // Here, you'd fetch items from your database
            return new List<string> { "Item1", "Item2" };
        }
    }
}

ASP.NET denetçilerinizde, bu işleyicileri komutları ve sorguları işlemek için kullanırsınız. Bir görev eklemek için, denetçi eylemi bir AddTaskCommand oluşturur, form verilerinden gelen özelliklerini ayarlar ve ardından onu bir AddTaskCommandHandler örneğine geçerek işler. Görevleri almak için, veriyi almak ve bakış açısına geçirmek üzere bir GetTasksQueryHandler çağırır.

Bir Kontrolde Bağlantı Kurma

Komutlarınızı ve sorgularınızı ayarladıktan sonra, şimdi bunları denetçilerinizde kullanabilirsiniz. Bunu bir ItemsController sınıfında şu şekilde yapabilirsiniz:

public class ItemsController : Controller
{
    private readonly ICommandHandler<AddItemCommand> _addItemHandler;
    private readonly IQueryHandler<GetItemsQuery, IEnumerable<string>> _getItemsHandler;

    // Constructor injection is correctly utilized here
    public ItemsController(ICommandHandler<AddItemCommand> addItemHandler, IQueryHandler<GetItemsQuery, IEnumerable<string>> getItemsHandler)
    {
        _addItemHandler = addItemHandler;
        _getItemsHandler = getItemsHandler;
    }

    public IActionResult Index()
    {
        // Use the injected _getItemsHandler instead of creating a new instance
        var query = new GetItemsQuery();
        var items = _getItemsHandler.Handle(query);
        return View(items);
    }

    [HttpPost]
    public IActionResult Add(string name, int quantity)
    {
        // Use the injected _addItemHandler instead of creating a new instance
        var command = new AddItemCommand(name, quantity);
        _addItemHandler.Handle(command);
        return RedirectToAction("Index");
    }
}

Her şeyi bağlamak için, özellikle ASP.NET Core'da Bağımlılık Enjeksiyonu (DI) kullanıyorsanız, komut ve sorgu işleyicilerinizi Startup.cs dosyasında DI konteyneri ile kaydetmeniz gerekecek. Bu şekilde, ASP.NET işleyici örneklerinizi ihtiyaç duyulduğunda sağlayabilir.

İşte bir işleyiciyi kaydetmenin çok temel bir örneği:

builder.Services.AddTransient<ICommandHandler<AddItemCommand>, AddItemCommandHandler>();
builder.Services.AddTransient<IQueryHandler<GetItemsQuery, IEnumerable<string>>, GetItemsQueryHandler>();

CQRS'nin pratik uygulamasında, yazma işlemleri için veri modelinin ve okuma işlemleri için olanın ayrımı temeldir, böylece mimari, veriyi ele almak için çeşitli ve optimize edilmiş yaklaşımları destekler.

IronPDF: C# PDF Kütüphanesi

CQRS Pattern C# (Geliştiriciler İçin Nasıl Çalışır): Şekil 3 - IronPDF web sayfası

PDF düzenleme için IronPDF'i Keşfedin, C# programlama dili ile çalışan geliştiriciler için bir araçtır, ve doğrudan uygulamalarınızda PDF belgeleri oluşturmanızı, okumanızı ve düzenlemenizi sağlar. Bu kütüphane, PDF raporları, faturalar veya HTML'den PDF oluşturma gibi PDF işlevselliklerini entegre etmeyi daha basit hale getiren kullanıcı dostu bir kütüphanedir. IronPDF, PDF'lerdeki metin ve resimleri düzenlemek, belge güvenliğini ayarlamak, ve web sayfalarını PDF formatına dönüştürmek gibi çeşitli özellikler destekler. Çok yönlülüğü ve kolay kullanımı, projelerinde PDF işlemlerini uygulamak isteyen geliştiriciler için değerli bir kaynak yapar.

IronPDF, tüm düzenleri ve stilleri bozulmadan koruyarak HTML'yi PDF'ye dönüştürme yeteneği ile öne çıkar. Web içeriğinden PDF'ler oluşturur, raporlar, faturalar ve dokümantasyon için uygundur. HTML dosyaları, URL'ler ve HTML dizgileri kesintisiz olarak PDF'ye dönüştürülebilir.

using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        // 1. Convert HTML String to PDF
        var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
        var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
        pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");

        // 2. Convert HTML File to PDF
        var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
        var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
        pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");

        // 3. Convert URL to PDF
        var url = "http://ironpdf.com"; // Specify the URL
        var pdfFromUrl = renderer.RenderUrlAsPdf(url);
        pdfFromUrl.SaveAs("URLToPDF.pdf");
    }
}

Kod Örneği

Şimdi, Command Query Responsibility Segregation (CQRS) deseni izleyen bir C# uygulamasında IronPDF'in nasıl kullanılabileceğini inceleyelim. Aşağıda, CQRS kurulumunda bir PDF raporu oluşturmak için IronPDF'in nasıl kullanılabileceğini gösteren basitleştirilmiş bir örnek bulunmaktadır. Bu örnek kavramsal olup, bir komut olarak bir PDF belgesi oluşturma üzerine odaklanır.

using IronPdf;
using System.Threading.Tasks;

namespace PdfGenerationApp.Commands
{
    public class GeneratePdfReportCommand
    {
        // Command handler that generates a PDF report
        public async Task GenerateReportAsync(string reportContent, string outputPath)
        {
            // Initialize the IronPDF HTML to PDF renderer
            var renderer = new ChromePdfRenderer();
            // Use IronPDF to generate a PDF from HTML content
            var pdf = await Task.Run(() => renderer.RenderHtmlAsPdf(reportContent));
            // Save the generated PDF to a specified path
            pdf.SaveAs(outputPath);
        }
    }
}

Bu örnekte, GeneratePdfReportCommand CQRS deseninde bir komutu temsil eder. GenerateReportAsync metodu içerir, bu metot reportContent olarak bir HTML dizgisi ve PDF raporunun kaydedileceği bir outputPath alır. IronPDF'in HtmlToPdf sınıfı, HTML içeriğini PDF formatına dönüştürmek için kullanılır ve belirtilen yola kaydedilir. Bu kurulum, PDF oluşturma işlevselliğini uygulamanızın mimarisine nasıl entegre edebileceğinizin bir örneğini sunar, özellikle CQRS'nin teşvik ettiği gibi net sorumlulukların ayrılması gereken senaryolarda.

CQRS Pattern C# (Geliştiriciler İçin Nasıl Çalışır): Şekil 4 - Çıktı PDF

Sonuç

Özetle, Command Query Responsibility Segregation (CQRS) deseni, uygulamalarınızda veri okuma ve yazma sorumluluklarını ayırmak için yapılandırılmış bir yaklaşım sunar. Bu ayrım, sadece mimariyi netleştirmekle kalmaz, aynı zamanda sistemlerinizin esnekliğini, ölçeklenebilirliğini ve performansını artırır. Yukarıda belirtilen adımları izleyerek CQRS'yi ASP.NET Core uygulamalarınızda uygulayabilir, komutlar, sorgular ve bunların işleyicileri arasında iletişimi kolaylaştırmak için MediatR gibi araçları kullanabilirsiniz.

IronPDF'i CQRS tabanlı uygulamanıza entegre etmek, PDF belgelerini zahmetsizce oluşturma, işleme ve saklama olanağını sağlayarak yeteneklerinizi daha da genişletir. Raporları, faturaları veya herhangi bir belge türünü oluştururken, IronPDF'in kapsamlı özellikleri ve anlaşılır sentaksı, geliştirme araç kutunuzdaki güçlü bir araç haline gelir. IronPDF, yeteneklerini taahhütte bulunmadan önce keşfetme fırsatı sunan bir ücretsiz deneme sunar. Sürekli kullanım için, lisanslar $999'den başlayarak projenizin ihtiyaçlarına uygun çeşitli seçenekler sunar.

Jacob Mellor, Teknoloji Direktörü @ Team Iron
Teknoloji Direktörü

Jacob Mellor, Iron Software'de Baş Teknoloji Yöneticisidir ve C# PDF teknolojisinde öncü bir mühendisdir. Iron Software'ın ana kod tabanının ilk geliştiricisi olarak, CEO Cameron Rimington ile birlikte şirketin ürün mimarisini 50'den fazla kişilik bir şirkete dönüştürmüştür ve NASA, Tesla ve dünya genelindeki devlet kurumlarına hizmet etmektedir.

...
Daha Fazla Oku

İlgili Makaleler

Key in blue circle

Ücretsiz 30 günlük Deneme Anahtarınızı anında edinin.

Your trial license will be sent to your email address

Herhangi bir sınırlama yoktur. %100 erişim. Kredi kartı gerekmez.

bullet_checkedKredi kartı veya hesap oluşturma gerektirmezHerhangi bir sınırlama yoktur. %100 erişim. Kredi kartı gerekmez.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Ücretsiz Canlı Demo rezervasyonu yapın
Booking Badge

Dünya Çapında Milyonlarca Mühendisin Güvendiği

Iron Software müşteri logoları
Bağımsız Danışmanlık Alın
Aşağıdaki formu doldurun veya sales@ironsoftware.com adresine e-posta gönderin
Bilgileriniz daima gizli kalacaktır.
Dünya Çapında Milyonlarca Mühendisin Güvendiği
Iron Software müşteri logoları
Ücretsiz 30 Günlük Deneme Anahtarınızı anında alın.
Kredi kartı veya hesap oluşturma gerektirmez