Wciąż pamiętam stare dobre czasy repozytoriów. Ale repozytoria z czasem stawały się brzydkie. Następnie CQRS znalazło się w głównym nurcie. Byli mili, byli powiewem świeżego powietrza. Ale ostatnio wielokrotnie zadawałem sobie pytanie, dlaczego nie zachowuję logiki w metodzie Action Controller (szczególnie w Web Api, gdzie akcja jest rodzajem programu obsługi poleceń / zapytań).
Wcześniej miałem na to wyraźną odpowiedź: robię to w celu testowania, ponieważ ciężko jest przetestować kontroler z tymi wszystkimi niemożliwymi do wyrzucenia singletonami i ogólnie brzydką infrastrukturą ASP.NET. Ale czasy się zmieniły, a klasy infrastruktury ASP.NET są obecnie znacznie bardziej przyjazne dla testów jednostkowych (szczególnie w ASP.NET Core).
Oto typowe wywołanie WebApi: dodano polecenie i klienci SignalR zostali o tym powiadomieni:
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);
}
}
Mogę z łatwością przeprowadzić test jednostkowy / wykpić to. Co więcej, dzięki OWIN mogę skonfigurować lokalne serwery WebApi i SignalR i wykonać test integracji (a przy okazji całkiem szybki).
Ostatnio odczuwałem coraz mniejszą motywację do tworzenia nieporęcznych programów obsługi poleceń / zapytań i zwykle utrzymuję kod w działaniach interfejsu API sieci Web. Robię wyjątek tylko wtedy, gdy logika się powtarza lub jest naprawdę skomplikowana i chcę ją odizolować. Ale nie jestem pewien, czy robię tutaj właściwą rzecz.
Jakie jest najbardziej rozsądne podejście do zarządzania logiką w typowej nowoczesnej aplikacji ASP.NET? Kiedy uzasadnione jest przeniesienie kodu do programów obsługi poleceń i zapytań? Czy są jakieś lepsze wzory?
Aktualizacja. Znalazłem ten artykuł o podejściu DDD-lite. Wygląda więc na to, że moje podejście do przenoszenia skomplikowanych części kodu do programów obsługi poleceń / zapytań można nazwać CQRS-lite.