Ako mapovat business logiku na UI

Ahojte,
zaujima ma, ako by ste pristupovali k takemuto scenaru:

navrhujem teraz architekturu pre novy projekt, internu LOB aplikaciu s komplexnou business logikou a par pouzivatelmi a chcel by som sa poradit ako oddelit UI od business logiky. Aplikacia je Rich client (Blazor Server).

Business logiku si mozete predstavit ako analogiu k tomuto:

  1. Uzivatel vytvara objednavku, tak ze vyberie produkt z katalogu → zbehne komplexna business logika, ktora vypocita supisku potrebneho materialu, cenu, cas vyroby atd.

  2. Uzivatel rucne zmeni niektore parametre → zbehne komplexna business logika, ktora prepocita…

Tuto logiku som implementoval a otestoval v Domain vrstve, kde som nasledoval DDD principy.

napriklad.

public class  ProductOrder
{
     public IReadOnlyCollection<ProductOrderMaterial> MaterialItems { get; }
     public void SetSomeParameter(double value)
     {
           SomeParameter = value;
           RecalculateMaterials();
           RecalculateTime();
           RecalculatePrice();
     }
}

UX by mal byt asi takyto:

  1. Uzivatel vytvara objednavku, tak ze vyberie produkt z katalogu => vidi prepocitane data
  2. Uzivatel rucne zmeni niektore parametre => vidi prepocitane data
  3. Uzivatel klikne na save - az vtedy sa uklada do databazy

Otazka znie, ako dostat tuto business logiku z domenovej vrstvy na UI?

Typicky sa vytvori nejaky viewmodel namapovanim z prislusnej domenovej entity a pri ukladani sa namapuje viewmodel na domenova entitu.

Toto ale vobec neriesi tu komplexnu business logiku, ktora ma zbehnut medzitym a prejavit sa na UI.

Ako by ste teda riesili tie “Long living” viewmodely, ich mapovanie na business entity a ich prepocitavanie?

Ja pouzivam anemicky domenovy model, tak toto mam trochu lahsie. No konkretne v Blazor Server pouzivam fasady (v podstate metoda fasady = use case, ale casto su aj pomocne pre zobrazovanie prvkov v UI).

Na tvojom mieste by som to riesil tak, ze namapujes viemodel na vstup fasady, co to prepocitava a podla vysledkov updatol existujuci viewmodel. Tam toho asi vela nevymyslis.