Przeczytałem niektóre z pytań dotyczących anemicznych modeli domen i separacji problemów. Jakie są najlepsze techniki wykonywania/dołączania logiki domeny do obiektów z anemicznymi domenami? W mojej pracy mamy dość anemiczny model i obecnie używamy klas "pomocnika" do wykonania logiki bazy danych/biznesowej na obiektach domeny. Na przykład:Techniki radzenia sobie z anemicznym modelem domeny
public class Customer
{
public string Name {get;set;}
public string Address {get;set;}
}
public class Product
{
public string Name {get;set;}
public decimal Price {get;set;}
}
public class StoreHelper
{
public void PurchaseProduct(Customer c, Product p)
{
// Lookup Customer and Product in db
// Create records for purchase
// etc.
}
}
Gdy aplikacja potrzebuje do zrobienia zakupu, to stworzyć StoreHelper i wywołać metodę na obiektach domen. Dla mnie sensowne byłoby, aby Klient/Produkt wiedział, jak zapisać się do repozytorium, ale prawdopodobnie nie chciałbyś użyć metod Save() na obiektach domeny. Ma to również sens w przypadku metody takiej jak Customer.Purchase (Product), ale polega to na wprowadzeniu logiki domeny do encji.
Oto niektóre techniki Natknąłem, nie wiem, które są dobre/złe:
- klienta i produktów dziedziczą z klasy „podmiot”, który zapewnia podstawowe operacje CRUD w sposób ogólny (użycie ORM).
- Plusy: Każdy obiekt danych będzie automatycznie uzyskać operacje CRUD, ale są następnie przywiązany do bazy danych/ORM
- Minusy: To nie rozwiązuje problemu działalności gospodarczej na obiektach, a także łączy wszystkie obiekty domeny do jednostki bazowej, która może nie być odpowiedni
- klas Zastosowanie pomocniczy do obsługi operacji CRUD i logikę biznesową
- Czy jest sens mieć DAOs dla „czystych baz danych” operacji, oddzielna pomocnicy biznesu dla nich czy operacje związane z biznesem?
- Czy w tym celu lepiej używać niestatycznych lub statycznych klas pomocniczych?
- Plusy: obiekty domen nie są przywiązane do dowolnej bazy danych/logiki biznesowej (całkowicie anemiczny)
- Wady: niezbyt OO, niezbyt naturalny używać pomocników w kodzie aplikacji (wygląda jak kod C)
- użyj techniki podwójnego wysyłki, w którym jednostka ma metody, aby zapisać się do dowolnego repozytorium
- Plusy: lepsza separacja obawy
- Wady: podmioty jakieś dodatkowe logiki załączony (chociaż jest oddzielona)
- W języku C# 3.0, można użyć metody rozszerzenie dołączyć metody CRUD/biznesowych do obiektu domeny bez dotykania
- Czy to ważne podejście? Jakie są zalety/wady?
- Inne techniki?
Jakie są najlepsze techniki radzenia sobie z tym? Jestem całkiem nowy w DDD (czytam książkę Evansa - więc może to otworzy mi oczy)
Wydaje się, że wiele różnych klas służy tylko klientowi. Dlaczego nie wyrzucić większości z nich w jednej klasie, z usługą do obsługi wszystkiego, co złożone? –
Moja odpowiedź jest stara jak diabli. : D –
@LuckyLindy Głównie dlatego, że DDD polega na tworzeniu pomostu pomiędzy ekspertami w dziedzinie i programistami. Model domeny nie powinien zawierać elementów technicznych, inaczej wszechobecny język nie będzie istniał. Aby wyprowadzić sprawy techniczne - musimy je streścić. Abstrahowanie od czegoś zawsze powoduje zawyżenie bazy kodu. –