Wyłączać lazy loading chcą głównie ludzie, którzy nie rozumieją jak działają ORMy, po co się ich używa i forsują architekturę zwaną "encja na twarz i pchasz" (tudzież mniej metaforycznie "wysraj bazę na ekran").
W sytuacji, gdy klas reprezentujących rekordy bazy danych używa jako viewmodeli, to faktycznie lazy loading spowoduje problemy wydajnościowe. Ale ich przyczyną będzie architektura (czy raczej jej brak) oraz łamanie SRP, nie lazy loading sam w sobie. Ale jak się stosuje jakąś sensowną architekturę, w której obiekty GUI i obiekty ORMa, to różne typy, to tego problemu nie ma w ogóle. Jeśli viewmodel nie jest obiektem ORMa, to nie ma szans żeby ORM próbował nagle coś z bazy dociągać, więc na żadne zbędne selecty nie ma co liczyć. Po prostu dobra architektura rozwiązuje dylemat konfiguracji ORMa za nas.
Problem może zatem wystąpić w logice biznesowej, gdy operujemy na jakiejś encji i encjach zależnych od niej. Np. Invoice
, Customer
, Discount
i kolekcja InvoiceItem
. I teraz:
- Chcemy zmienić kontrahenta - oczywistym jest, że nie chcemy wczytywać wszystkich pozycji faktury w tym celu.
- Chcemy obliczyć rabat, w zależności od tego, ile lat kontrahent z nami współpracuje. Raczej nie ma sensu ładowanie obiektu
Discount
, jeśli warunek nie jest spełniony.
- Chcemy obliczyć kwotę faktury - oczywistym jest, że nie ma sensu doczytywanie ich po kolei, chcemy je wszystkie na raz.
Wniosek - ładujemy leniwie gdy:
- wiemy, że czegoś nie potrzebujemy;
- nie wiemy, czy czegoś potrzebujemy;
- będziemy czegoś potrzebowali lub nie w zależności od innych warunków.
Jedynie, gdy jesteśmy pewni, że czegoś potrzebujemy, to ładujmy to zachłannie.