2010-04-04 19 views
5

Sto cercando un feedback sull'architettura dell'applicazione CMS basata su ASP.NET MVC.ASP.NET MVC application guidelines "guidelines"

Modello di dominio: dipende da nient'altro che dalle classi di sistema per definire i tipi. Per ora, per lo più anemico.

Repository Strato - l'accesso ai dati astratto, chiamato solo dal livello dei servizi

Servizi Strato - esegue la logica di business in modelli di dominio. Espone i modelli di visualizzazione ai controller.

ViewModelMapper - servizio che traduce avanti e indietro tra i modelli vista e modelli di dominio

Controllori - funzionalità super sottile "vigile" stile che interagisce con il livello di servizio e parla solo in termini di modelli di vista, mai modelli di dominio

Il mio modello di dominio è utilizzato principalmente come oggetti di trasferimento dati (DTO) e al momento ha una logica minima. Sto scoprendo che questo è bello perché non dipende da nulla (nemmeno dalle classi nel livello dei servizi).

Il livello di servizi è un po 'complicato ... Voglio solo che i controller abbiano accesso a viewmodels per facilitare la programmazione della GUI. Tuttavia, alcuni servizi devono parlare tra loro. Ad esempio, ho un servizio di eventing che notifica altri servizi listener quando il contenuto viene taggato, quando vengono creati post di blog, ecc. Attualmente, i metodi che accettano i modelli di dominio come input o li restituiscono sono contrassegnati internamente in modo che non possano essere utilizzati da i controller.

Suona come eccessivo? Non abbastanza astrazione? Lo sto facendo principalmente come esercizio di apprendimento per essere rigoroso sull'architettura, non per un prodotto reale, quindi per favore nessun commento sulla falsariga di "giusto dipende da cosa vuoi fare".

grazie!

+1

Il fatto che sei riuscito a dire così tanto in così poche parole dovrebbe darti l'idea che sei sulla strada giusta. – pdr

risposta

2

Nel complesso, il design sembra buono per me.

ci sono un paio di elementi che potrei fare:

  • convalide - avere una validazione 2 step -
    Fase 1: le classi a livello di dominio far rispettare la propria validità (tramite attributi o qualsiasi altro meccanismo).
    Passaggio 2: il repository garantisce che l'oggetto sia valido nel contesto del repository

  • Iniezione di dipendenza: utilizzare un framework DI per iniettare dipendenze. Sarà utile per il test dell'unità. Inoltre, se il livello di servizio in cui è necessario chiamare tra i servizi, controllare se questo articolo su Aggregate Il servizio è utile: http://blog.ploeh.dk/2010/02/02/RefactoringToAggregateServices.aspx

    • ViewModels - potrebbe essere tentati di riutilizzo, ma aspetta & orologio prima finalmente si decide

HTH.

+0

Buona risposta. Ai vecchi tempi chiamavamo il passaggio 1 "Convalida" e il passaggio 2 "Verifica". – pdr

+0

Grazie Sunny.In realtà sto usando StructureMap per DI, quindi sono bravo lì. Attualmente, per la convalida, dispongo di un servizio di convalida che convalida i modelli di dominio. Mi piace che i modelli si impediscano di entrare in uno stato non valido, e penso che preferisco avere le regole aziendali di tipo "stato valido" incorporate nei modelli di dominio. Dove traccia la linea tra le regole che vanno nel modello di dominio e altrove (servizio di validazione, repository, ecc.)? –

+0

Per mantenere il mio modello di dominio in uno stato valido non inserisco alcun setter di proprietà sul mio modello. Invece, tutti i cambiamenti di stato devono passare attraverso un metodo che verifica che la modifica sia appropriata prima di applicarla. Il rovescio della medaglia è che se hai un sacco di potenziali cambiamenti questo può diventare una buona quantità di codice. Le operazioni di creazione e cancellazione continuano ancora sul livello del repository. – Ryan