Ana içeriğe atla

CQRS Nedir?

CQRS Nedir?

CQRS (Command Query Responsibility Segregation), bir yazılım tasarım desenidir ve bir uygulamanın yazma (command) ve okuma (query) işlemlerini farklı modeller ve yöntemlerle ele alır. Bu desen, uygulamanın veri modelini iki ayrı model haline getirir: biri yazma işlemleri için, diğeri okuma işlemleri için.

CQRS deseni özellikle büyük ve karmaşık uygulamalarda kullanılır. Bu desen, yazma ve okuma işlemleri arasındaki etkileşimleri basitleştirir, ölçeklenebilirliği arttırır ve uygulamanın performansını arttırır. Ayrıca, CQRS deseni, Domain Driven Design (DDD) ve Event Sourcing gibi diğer yazılım tasarım desenleriyle de sıklıkla kullanılır.

Örneğin, bir banka uygulamasında CQRS deseni kullanabiliriz. Öncelikle, “Commands” adı verilen bir model oluşturulur. Bu model, hesapta gerçekleştirilecek yazma işlemleri için kullanılır. Örneğin, para yatırma veya para çekme işlemleri için DepositCommand ve WithdrawalCommand modelleri oluşturulabilir.

Daha sonra, “Queries” adı verilen ayrı bir model oluşturulur. Bu model, hesap bilgilerini almak için kullanılır. Örneğin, hesap bakiyesini sorgulama işlemi için AccountBalanceQuery modeli oluşturulabilir.

Örneğin, bir kullanıcının hesap bilgilerini almak için şöyle bir kod kullanabiliriz:

var query = 
new AccountBalanceQuery {
AccountId = accountId
};

var accountBalance = accountQueryService.GetAccountBalance(query);

Yine aynı şekilde, bir kullanıcının hesabına para yatırmak için şöyle bir kod kullanabiliriz:

var command = 
new DepositCommand {
AccountId = accountId,
Amount = amount
};

accountCommandService.Deposit(command);

Yazma ve okuma işlemleri farklı hizmetlerle ele alınır. Örneğin, IAccountCommandService ve IAccountQueryService gibi ayrı hizmetler oluşturulabilir. Bu hizmetler, uygulamanın yazma işlemlerini ve okuma işlemlerini farklı birimlerde ele alabilir. Bu şekilde, ölçeklenebilirliği arttırılır ve performans optimize edilir.

Biraz daha farklı bir şekilde örneklendirmek gerekirse;

Deposit, Para Çekme ve Transfer işlemleri için birer command oluşturalım.

public class DepositCommand
{
public Guid AccountId { get; set; }
public decimal Amount { get; set; }
}

public class WithdrawalCommand
{
public Guid AccountId { get; set; }
public decimal Amount { get; set; }
}

public class TransferCommand
{
public Guid FromAccountId { get; set; }
public Guid ToAccountId { get; set; }
public decimal Amount { get; set; }
}

Hesap detayları ve hesap haraketlerini sorgulamak için bir query model oluşturalım.

public class AccountDetailsQuery
{
public Guid AccountId { get; set; }
}

public class AccountTransactionsQuery
{
public Guid AccountId { get; set; }
}

Deposit işlemini gerçekleştiren bir command serviceörneği oluşturalım.

public class DepositCommandService : IDepositCommandService
{
public void Deposit(DepositCommand command)
{
// TODO: hesap bakiyesini artırma işlemini gerçekleştir
}
}

Hesap detayları sorgusunu gerçekleştiren bir query serviceörneği

public class AccountDetailsService : IAccountDetailsService
{
public AccountDetailsQueryResult GetAccountDetails(AccountDetailsQuery query)
{
// TODO: veritabanından hesap detaylarını sorgula ve sonucu döndür
}
}

Transfer işlemini gerçekleştirmek için bir command serviceörneği

public class TransferCommandService : ITransferCommandService
{
public void Transfer(TransferCommand command)
{
// TODO: kaynak hesaptan hedef hesaba belirtilen miktarı aktar
}
}

Hesap haraketleri sorgusu için bir query service örneği

public class AccountTransactionsService : IAccountTransactionsService
{
public AccountTransactionsQueryResult GetAccountTransactions(AccountTransactionsQuery query)
{
// TODO: veritabanından hesap işlemlerini sorgula ve sonucu döndür
}
}

Bu kod örnekleri, bir banka hesabı uygulamasının yazma (command) ve okuma (query) işlemlerinin nasıl ayrı modeller ve servisler aracılığıyla ele alınabileceğini göstermektedir. Tabii ki, bu sadece basit bir örnek ve gerçek dünyada CQRS deseninin uygulanması çok daha karmaşık olabilir. Ancak, bu örnekler temel fikri anlamak için yararlı olabilir.

Yorumlar

Bu blogdaki popüler yayınlar

Format atamadım

Bu gün bilgisayarıma format atmaya çalışırken delirdim. Hiç bir şey istediğim gibi gitmedi. Önce DVD-Rw bozuldu ardından harddiski görmedi sonra cd çalışmadı . vazgeçtim formattan. Resimlerin arasında gezinirken bunu görünce dayanamadım dedim tam benlik hemen yazmalıyım en azından içimi dökeyimde rahatlayayım dedim. Şu anda yukarıdaki yaratığa benziyorum. çıldırmış bir vaziyette bilgisayarın başında oturuyorum :((

Yalnız Kayık

Bir hikayesi olmalımı olmamalı mı ? bilmiyorum ! geçen gün sabaha karşı arkadaşımla beraber çektik bu fotoğrafı. Bu aralar sabaha karşı dışarı çıkıp fotoğraf çekmek moda oldu. Hele birde bir iki bira içmişsek süper. Sabahı beklemek (benim için börekçilerin açıldığı saati :) ) güzel bir duygu herkes yataklarında uyurken ayakta olmak ve hala ayakta olan başka insanlar görmek 'nadirde olsa. öyle işte ..

süslü kahve

Bazen bir yudum kahve iyi gelir ...