Я все ще пам’ятаю старі добрі часи сховищ. Але сховища звикли рости з часом некрасиво. Тоді CQRS отримав мейнстрім. Їм було приємно, вони затамували свіже повітря. Але останнім часом я знову і знову запитую себе, чому я не дотримуюся логіки правильно в методі дій Controller's Action (особливо в Web Api, де дія є якоюсь самою обробкою команд / запитів).
Раніше у мене була чітка відповідь на це: я роблю це для тестування, оскільки важко перевірити контролер з усіма цими нерозбірними сингтонами та загальною потворною інфраструктурою ASP.NET. Але часи змінилися, і класи інфраструктури ASP.NET набагато більш приємні для тестування одиниць (особливо в ASP.NET Core).
Ось типовий виклик WebApi: додана команда і про це сповіщуються клієнти SignalR:
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);
}
}
Я легко можу випробувати тест / знущатися над ним. Більше того, завдяки OWIN я можу налаштувати локальні сервери WebApi та SignalR і зробити тест на інтеграцію (і досить швидко, до речі).
Останнім часом у мене виникає все менша мотивація створювати громіздкі обробники команд / запитів, і я схильний тримати код у діях Web Api. Я роблю виняток лише в тому випадку, якщо логіка повторюється або вона дуже складна і я хочу її ізолювати. Але я не впевнений, чи правильно я роблю тут.
Який найбільш розумний підхід для управління логікою в типовому сучасному додатку ASP.NET? Коли розумно перемістити код на обробники команд і запитів? Чи є кращі зразки?
Оновлення. Я знайшов цю статтю про підхід DDD-lite. Тож здається, що мій підхід переміщення складних частин коду до обробників команд / запитів можна назвати CQRS-lite.