Stavo parlando con un amico un altro giorno di OOP in piccoli progetti. Nella maggior parte dei progetti che io e lui abbiamo lavorato, SOA era la regola.
Ad esempio, immagina un ordine in un'applicazione SOA. Lo scenario di questa applicazione potrebbe essere:
- Molti servizi (UpdateOrderService, CreateOrderService, ecc.) che si chiamano a vicenda.
- I dati dell'Ordine sono tutti aperti (molti getter e setter) da manipolare per qualsiasi Servizio.
- Le regole aziendali sono distribuite in molti servizi.
Come ha detto Vaughn Vernon in uno dei suoi libri, questo tipo di strategia non funzionerà bene per progetti più grandi con regole aziendali più complesse. Molti di noi lo sanno anche loro.
A proposito, SOA ha molti significati diversi e sto prendendo quello semplice, descritto da Vaughn Vernon: classi di servizio che si chiamano a vicenda.
L'alternativa più ovvia è Domain Driven Design , giusto? Ma ragazzo, questa risposta per un semplice problema mi ricorda questa frase: "che è aumentata rapidamente". Quando confronti un semplice SOA vs DDD, stiamo introducendo un sacco di nuovi modelli e complessità:
- Unità di lavoro
- CQRS
- Aggregazione
- Dominio
- sottodominio
- Mappers
- Eventi
- Comando
- Oggetto valore
E ecc. Lavoro già in un grande progetto C # usando DDD. È stata un'esperienza straordinaria e un'opportunità per imparare, ma non è pratico introdurre tutti questi concetti in un progetto più piccolo.
Esiste un approccio chiamato DDD-lite , ma non riesco a trovare esempi validi o più dettagliati a riguardo.
Nel territorio DDD-lite, Uno di questi esempi non affronta uno dei problemi principali che appaiono in alcuni progetti: usa l'entità database come oggetto dominio. Per me questo è un errore, perché non è possibile mantenere l'entità aggiornata con i cambiamenti costanti del modello e verrà mescolata con un'altra astrazione presto o tardi (come l'uso di VO per rappresentare alcuni modelli). Vedo l'entità solo come un luogo in cui salvare / aggiornare / eliminare e cercare informazioni.
E, per me, questa traduzione tra database e dominio è una delle principali sfide per creare un progetto OOP. Con tutte le associazioni di oggetti e le operazioni (creare, aggiornare ed eliminare), non ho trovato un modo semplice per introdurlo in un progetto.
Quindi, la mia domanda è: c'è un midterm tra SOA e DDD per introdurre un concetto OOP nell'applicazione senza mantenerli sui Servizi?