Я до сих пор помню старые добрые времена хранилищ. Но хранилища со временем становились безобразными. Тогда CQRS получил господствующую тенденцию. Они были хороши, они были глотком свежего воздуха. Но в последнее время я снова и снова спрашиваю себя, почему я не придерживаюсь логики в методе Controller's Action (особенно в Web Api, где action сам по себе является своего рода обработчиком команд / запросов).
Ранее у меня был четкий ответ на этот вопрос: я делаю это для тестирования, так как сложно протестировать Controller со всеми этими немодными синглетонами и общей уродливой инфраструктурой 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.