Ho letto alcune delle domande relative ai modelli di dominio anemico e alla separazione delle preoccupazioni. Quali sono le migliori tecniche per eseguire/allegare la logica di dominio su oggetti di dominio anemici? Nel mio lavoro, abbiamo un modello piuttosto anemico e al momento utilizziamo classi "helper" per eseguire la logica del database/business sugli oggetti del dominio. Per esempio:Tecniche per gestire il modello di dominio anemico
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.
}
}
Quando l'applicazione ha bisogno di fare un acquisto, si creerebbe la StoreHelper, e chiamare il metodo sugli oggetti di dominio. Per me, sarebbe logico che il Cliente/Prodotto sapesse come salvarsi in un repository, ma probabilmente non vorresti i metodi Save() sugli oggetti del dominio. Avrebbe anche senso per un metodo come Customer.Purchase (Product), ma ciò sta mettendo la logica del dominio sull'entità.
Ecco alcune tecniche che ho incontrato, non è sicuro che sono buono/cattivo:
- cliente e del prodotto ereditare da una classe di "Entity", che fornisce le operazioni CRUD di base in maniera generica (usando un ORM forse).
- Pro: Ogni oggetto di dati sarebbe automaticamente ottenere le operazioni CRUD, ma vengono poi legato al database/ORM
- Contro: Questo non risolve il problema delle operazioni di business sugli oggetti, e lega anche tutti gli oggetti di dominio a un'entità di base che potrebbe non essere appropriato
- classi Usa helper per gestire le operazioni CRUD e la logica di business
- ha senso avere DAO per le operazioni di "pure database", e aiutanti di business separate per loro O operazioni commerciali specifiche?
- È meglio utilizzare classi di helper statiche o non statiche per questo?
- Pro: oggetti di dominio non sono legati a qualsiasi logica di database/incassi (completamente anemica)
- Contro: non molto OO, non molto naturale da usare soccorritori in codice dell'applicazione (si presenta come codice C)
- utilizzare la tecnica doppio spedizione in cui le entità ha metodi per salvare un repository arbitrario
- Pro: migliore separazione tra gli
- Contro: entità hanno una logica supplementare divisoria (anche se è disaccoppiato)
- In C# 3.0, è possibile utilizzare metodi di estensione per collegare i metodi CRUD/azienda a un oggetto di dominio senza toccarlo
- Si tratta di un valido approccio? Cosa sono i pro/contro?
- Altre tecniche?
Quali sono le migliori tecniche per gestirlo? Sono abbastanza nuovo di DDD (sto leggendo il libro di Evans - quindi forse aprirò gli occhi)
Sembra un sacco di classi diverse solo per gestire un cliente. Perché non buttare la maggior parte di esso in una singola classe, con un servizio per gestire qualcosa di complesso? –
La mia risposta è vecchia come l'inferno. : D –
@LuckyLindy Principalmente perché DDD sta creando un ponte tra esperti di dominio e programmatori. Il modello di dominio non dovrebbe contenere materiale tecnico, altrimenti il linguaggio onnipresente non potrà esistere. Per uscire dalla roba tecnica - dobbiamo astrarla. L'astrazione di qualcosa gonfia sempre la base di codice. –