Aiuta a comprendere la modellazione nella progettazione orientata al dominio

3

Ho cercato di apprendere la progettazione basata sul dominio (e in modo simile su Onion Architecture) nell'ultima settimana. Penso di averne capito, ma come la matematica, faccio schifo per estrarre tutti i dettagli ...

Quindi sto progettando / costruendo un'applicazione ASP.NET MVC (costruendo un sito per promuovere gli ingorghi di gioco), applicando DDD al progetto. Ho letto tutto il saggio di Vaughn Vernon (ho appena scoperto il libro).

Tuttavia, sono un po 'bloccato sul modello di dominio del mio particolare progetto. Concettualmente, penso di avere un contesto limitato all'interno del mio dominio. Non sono sicuro se includi utenti Web (identità ASP.NET che ho intenzione di utilizzare).

Ecco il mio modello attuale (prototipo) (attualmente un contesto limitato):

Unaltrocontestolimitatochepossoprevedereinseguito,mapensochesiapiùinsintoniaconl'infrastruttura(pensiamoaOnionqui),èl'Utente(collegatoconl'autenticazione"Sviluppatore" sul contesto sopra). Ho due "oggetti valore" ("Sviluppatore" e "Descrizione"). Non sono sicuro che "Descrizione" debba essere solo una semplice stringa sull'entità "Progetto".

Pensando ai miei comportamenti invarianti, ho trovato il seguente:

  1. Un evento viene creato da uno sviluppatore (utilizzando un ruolo per questo) con date di inizio e fine.
  2. I team vengono creati uno sviluppatore per un evento .
  3. Un team crea un progetto per un evento
  4. Sviluppatori registrati per un evento attraverso un progetto (i) di che applica
    • Gli sviluppatori possono aderire a più progetti
    • applicare : fornire al capo squadra il nome e il ruolo dello sviluppatore in cui stanno cercando un progetto.
  5. I team possono essere creati come aperti ( Gli sviluppatori possono richiedere l'iscrizione) o chiusi (il leader della squadra deve invitare uno sviluppatore al team / progetto )

Per i miei aggregati, cosa faccio qui? Scrivo una classe "servizio" come " TeamProjectService " con metodi come " CreateTeamProject "? O che cosa?

Sto andando su questo nel modo giusto? O sono forse troppo complicato o mi manca qualcosa?

    
posta Zack 28.08.2015 - 06:32
fonte

1 risposta

2

Am I going about this the right way? Or am I maybe over-complicating it or missing something?

Penso che tu abbia un inizio di un progetto; stai prendendo in giro i concetti e le loro relazioni di base e i vincoli sulle relazioni, che è un ottimo inizio.

Per me, quello che mi piace fare è prima di fare qualsiasi dettaglio reale su classi e operazioni (es. quali metodi, dove va la logica del business), mi piace enumerare leggermente i concetti e le relazioni nei termini di business che creano l'onnipresente lingua per un modello di dominio. I concetti che hanno identità di business (ad esempio, biglietto aereo con localizzatore di record, utente con nome utente o ID univoco, ecc.) Probabilmente finiranno per essere radici aggregate. Idealmente, questi concetti e relazioni sono già noti nel business e non è necessario provare a reinventarli come parte del design. (E naturalmente, si verificheranno iterazioni, miglioramenti, refactoring, ecc.)

Quindi, per me personalmente, avendo un buon inizio ai concetti e alle relazioni, mi piace fare il design dell'applicazione dalle estremità verso il centro. Ci penso un po 'come progettare un ponte. Mi piace avere un progetto per gli argini prima, poi il mezzo (l'intervallo). In questa analogia, una fine del terrapieno è l'implementazione della persistenza, dove sto pensando ai concetti di modellazione e anche alle loro relazioni e alcuni dei loro vincoli con SQL usando le tabelle. L'altra estremità è l'interfaccia esposta esternamente, dove sto pensando a un'API REST usando i principi OData.

Quindi disegno le classi, i metodi e le operazioni come un ponte che si estende tra i due argini ora noti. Si noti inoltre che abbiamo molte scelte in merito al design della classe (ad es. Per usare ORM o no, quali classi ottengono i metodi e dove vanno le logiche delle applicazioni e delle applicazioni), poiché le classi nel mezzo sono più vicine all'implementazione interna e più lontane API esposta esternamente.

Penso che vorrà una nozione formale di diversi tipi di Utenti (oltre allo Sviluppatore), come il Portavoce di Business - potrebbero essere quelli che avviano i Progetti.

Il termine evento è abusato nel nostro business, quindi cerco di usarlo solo in un modo ristretto (la mia opinione è che un "evento" è qualcosa che è accaduto, una volta, solo ora o in passato, e gli eventi possono fuoco, essere abbonati, ecc ...). Pertanto, puoi scegliere un nome più specifico all'interno del tuo dominio aziendale per ciò che stai chiamando evento. D'altra parte, probabilmente mi muoverò nella direzione di più generici progetti ricorsivamente composti, quindi i progetti possono comporre / decomporsi in qualsiasi numero di altri progetti. Hai già diversi livelli specifici di composizione: Evento, Progetto, Applicazione, perché non diventare più generico? Tuttavia, la composizione ricorsiva potrebbe non essere sufficiente, potrebbe anche essere necessario tenere traccia delle dipendenze tra i progetti (ad esempio tra progetti secondari peer o progetti indipendenti che non sono composti). Potrei provare a formalizzare la nozione di pianificazione insieme alle nozioni di dipendenza.

For my aggregates, what do I do here? Do I write a "service" class like "TeamProjectService" with methods such as "CreateTeamProject"? Or what?

Ho due commenti qui.

In primo luogo, tenderei a considerare gli elementi elencati in grassetto come radici aggregate poiché probabilmente hanno identità solide esternamente riferibili al di fuori dell'aggregato. Le radici aggregate possono essere correlate ad altre radici aggregate (e per le relazioni NxM modellerei la persistenza per ognuna di quelle con la propria tabella di prima classe). Il modo in cui stai usando il termine aggregato sopra mi fa pensare alle relazioni tra le radici aggregate più delle entità all'interno dell'aggregato.

In secondo luogo, probabilmente farei la creazione di relazioni tramite un'operazione associata a una o entrambe le radici aggregate correlate. Ad esempio, un'entità della squadra potrebbe essere in grado di creare un progetto, oppure la raccolta del progetto potrebbe creare un progetto, anche se richiede un team come parametro.

In questi giorni, mi piace utilizzare OAuth2 (ad es. Windows Live, Facebook, Google+, Twitter, Stackoverflow) per l'autenticazione (eseguo OAuth2 direttamente, ma forse ACS di Azure può contribuire ad estrapolarlo attraverso la varietà di provider OAuth2).

    
risposta data 29.08.2015 - 19:38
fonte

Leggi altre domande sui tag