Hala eski güzel depoları hatırlıyorum. Ancak depolar zamanla çirkinleşiyordu. Sonra CQRS yaygınlaştı. Onlar güzel, temiz bir nefes vardı. Ama son zamanlarda kendime tekrar tekrar neden mantığı bir Kontrolcinin Eylem yönteminde (özellikle eylemin kendi içinde bir tür komut / sorgu işleyicisi olduğu Web Api'de) tutmuyorum soruyorum.
Daha önce bunun için net bir cevabım vardı: Denetleyiciyi tüm bu taşınmaz tek tonlarla ve genel çirkin ASP.NET altyapısıyla test etmek zor olduğu için test için yapıyorum. Ancak zaman değişti ve ASP.NET altyapı sınıfları günümüzde çok daha kolay birim testleri yapıyor (özellikle ASP.NET Core'da).
İşte tipik bir WebApi çağrısı: komutu eklenir ve SignalR istemcileri bu konuda bilgilendirilir:
public void AddClient(string clientName)
{
using (var dataContext = new DataContext())
{
var client = new Client() { Name = clientName };
dataContext.Clients.Add(client);
dataContext.SaveChanges();
GlobalHost.ConnectionManager.GetHubContext<ClientsHub>().ClientWasAdded(client);
}
}
Kolayca test edebilir / alay edebilirim. Dahası, OWIN sayesinde yerel WebApi ve SignalR sunucularını kurabilir ve bir entegrasyon testi yapabilirim (ve bu arada oldukça hızlı).
Son zamanlarda hantal Komutlar / Sorgular işleyicileri oluşturmak için gittikçe daha az motivasyon hissettim ve Web Api eylemlerinde kod tutma eğilimindeyim. Sadece mantık tekrarlanırsa veya gerçekten karmaşıksa bir istisna yaparım ve onu izole etmek istiyorum. Ama burada doğru olanı yapıp yapmadığımdan emin değilim.
Tipik bir modern ASP.NET uygulamasında mantığı yönetmek için en makul yaklaşım nedir? Kodunuzu Komutlar ve Sorgular işleyicilerine taşımak ne zaman mantıklıdır? Daha iyi kalıplar var mı?
Güncelleme. DDD-lite yaklaşımı hakkında bu makaleyi buldum . Kodun karmaşık kısımlarını komut / sorgu işleyicilerine taşıma yaklaşımım CQRS-lite olarak adlandırılabilir.