6

Sto usando asp.net mvc con il framework di entità e sto iniziando a imparare DDD. Sto lavorando a un progetto che contiene sondaggi. Ecco il mio modello di dominio:Qual è il modo migliore per costruire il modello di visualizzazione?

public class Survey 
{ 
    public int? SurveyID { get; set; } 
    public string Name { get; set; } 
    public decimal MinAcceptanceScore { get; set; } 
    public int UserFailsCount { get; set; } 

    public IEnumerable<SurveyQuestion> Questions { get; set; } 
    public IEnumerable<Prize> Prizes { get; set; } 
    public IEnumerable<SurveyAttempt> UserAttempts { get; set; } 
} 

ho bisogno di diverse parti di inchieste per diversi punti di vista così ho creato diverse ViewModels:

public class ShortSurveyViewModel 
    { 
     public int? SurveyID { get; set; } 
     public string Name { get; set; } 
     public int UserFailsCount { get; set; } 
     public IEnumerable<SurveyAttempt> UserAttempts { get; set; } 
    } 

    public class ShortSurveyWithPrizesViewModel 
    { 
     public int? SurveyID { get; set; } 
     public string Name { get; set; } 
     public int UserFailsCount { get; set; } 
     public IEnumerable<SurveyAttempt> UserAttempts { get; set; } 
     public IEnumerable<Prize> Prizes { get; set; } 
    } 

    public class SurveyEditViewModel 
    { 
     public int? SurveyID { get; set; } 
     public string Name { get; set; } 
     public decimal MinAcceptanceScore { get; set; } 
     public int UserFailsCount { get; set; } 

     public IEnumerable<SurveyQuestion> Questions { get; set; } 
     public IEnumerable<Prize> Prizes { get; set; } 
    } 

Quale sarebbe il modo migliore per costruire la mia architettura, se voglio che il mio repository di sondaggi per ottenere le informazioni necessarie per un modello di vista appropriato?

solusions diverse che vedo:

  1. Repository potrebbe tornare IQueryable per SurveyService e il servizio potrebbe tornare la vista del modello appropriete, ma ho esitato che facendo questo è giusto perché credo modelli vista dovrebbero essere creati in UI , non il livello di servizio.

  2. Creare tre classi appropriate nel mio livello dominio. Ma ora il dominio dipenderà dalla rappresentazione e con ogni nuova vista dovrebbe essere creata una nuova classe di dominio.

  3. Recupera l'oggetto dominio completo e associa solo le proprietà necessarie per una vista particolare. Questo non va bene perché nel mio esempio le domande sono necessarie solo in una rappresentazione e potrebbe essere una raccolta pesante.

+1

utilizza viste parziali –

+1

ViewModels deve vivere nell'interfaccia utente e popolarsi nel controller. I layer DAL e Domain non dovrebbero averne conoscenza –

+0

@DaveA Userò le viste parziali, ma la domanda non è su di esso. Sto chiedendo il modo ottimale per costruire i miei modelli di vista. –

risposta

8

dominio driven design:

  • Si dovrebbe avere un repository di ritorno radici aggregato - nel vostro caso Survey e tutte le relazioni che non può esistere senza genitore Survey
  • Questo repository caricherà sempre tutta Survey classe seconda le tue esigenze sono solo alcune delle relazioni (il DDD veramente dogmatico caricerebbe sempre l'intero aggregato ma non è un buon approccio per il web stateless).
  • Il livello applicazione (controller) richiederà il repository per Survey e relazioni selezionate e riempie i modelli di visualizzazione.architettura

Cipolla:

  • Si creerà un certo repository esponendo IQueryable<Survey> - ancora peggio che si intende utilizzare repository generico con un'interfaccia CRUD
  • si creerà qualche servizio chiamando repository e la costruzione di LINQ-to-entità proiezione nei DTO e ritorno al livello applicazione (controller)
  • E ora? È possibile utilizzare questi DTOs direttamente o utilizzare un altro set di oggetti usati come i vostri modelli vista con alcuni attributi relativi UI ecc C'è evidentemente qualcosa che non va ...

architettura semplice:

  • Avrete uso iniettato IDbSet<Survey> direttamente nel controller come un repository
  • farete proiezioni LINQ to entità direttamente nel controller di riempire vista modelli

Ther e non è il modo migliore. Riguarda sempre il tuo obiettivo e le tue aspettative. Per le piccole applicazioni è possibile vivere con un'architettura semplice senza problemi.

La progettazione del dominio è più complessa. Il concetto principale in DDD sono entità di dominio, oggetti valore e la loro composizione. L'entità dominio incapsula dati e logica eseguiti su quei dati. DDD non funziona con dati parziali o DTO - quando le entità di dominio non hanno alcuna logica si sta facendo male (si chiama modello anemico). Il servizio in DDD non è mediatore tra livello dell'applicazione e repository. Viene utilizzato per gestire la logica di business che non è correlata all'entità a dominio singolo (quindi non può essere incapsulata nell'entità di dominio). Il repository è un codice di infrastruttura necessario per materializzare i tuoi aggregati dallo storage e mantenerli nello storage. La logica dell'applicazione (controller) può interagire con entità di dominio, servizi e codice di infrastruttura.

Non mi piace l'architettura della cipolla.

+0

Questa è una spiegazione ben ponderata. Mi chiedo se potresti approfondire il motivo per cui non ti piace l'architettura della cipolla e forse spiegare perché c'è ovviamente qualcosa di sbagliato ... Non ho ancora abbastanza esperienza per essere ovvio per me. Inoltre non capisco appieno la differenza tra il terzo proiettile sotto DDD e il terzo proiettile sotto Cipolla. Non siete essenzialmente nello stesso posto, cioè un controller ora in possesso di oggetti Dominio (Entità in un caso e DTO nell'altro) che mapperà ai modelli di vista? Non sto facendo l'avvocato dei diavoli, sto solo cercando di imparare. –

+0

Grazie, Ladislav. Risposta molto informativa Ma non riesco a capire perché non ti piace l'architettura della cipolla. Dalla tua risposta ho capito che potrebbe essere la scelta migliore, perché l'architettura semplice non si adatta alle mie esigenze e DDD potrebbe non essere buono per il Web stateless. E se non fosse il DDD veramente dogmatico potrebbe avere alcune proprietà di Survey non piene di dati? –

+1

@ Quarantadue: è solo la mia opinione personale di precedenti esperienze. Secondo me l'architettura di cipolla porta a strati ridondanti. Ho persino lavorato a progetti in cui questi livelli sono stati suddivisi in sottostrati. Alla fine del progetto avevamo solo un sacco di codice in cui i metodi del livello superiore hanno solo una riga di codice che chiama il livello inferiore. Qualsiasi funzionalità aggiuntiva richiedeva l'aggiornamento di così tanti file solo per propagare qualcosa. Non è stato davvero buono. –

0

Considerando il fatto che la preoccupazione primaria è la quantità di dati recuperati dal Data Model contro la quantità di dati necessari nel Model View, direi l'approccio giusto per voi sarebbe quella di costruire Visualizzazioni in il database e i rispettivi modelli di dati.

Ciò consentirebbe di ridurre la quantità di dati sfruttati dal database in qualsiasi viaggio.

Sebbene i modelli di dati possano quasi imitare i modelli di vista, non è un problema, ma servono a due scopi distinti. Il modello di vista è per la vista da associare a - il modello di dati sa come ottenere e salvare i dati. La creazione di queste viste consentirebbe di ottenere i dati in modo ottimale, e tuttavia di creare una logica di salvataggio personalizzata in quegli stessi modelli per renderli scrivibili se necessario, pertanto è necessario che il modello di dati trasferisca i dati da un livello all'altro.

+0

Ho capito correttamente che dovrei avere due modelli esatti (uno nel livello dati, un altro in presentazione) e se ne cambio uno, anche un altro verrà modificato? –

+0

@AlexeyAza: si avranno due modelli, il modello dati (nel livello dati) e il modello vista (nel livello presentazione con i controller) ma la chiave è che penso che si voglia creare viste in database piuttosto che solo afferrare dati dal tavolo tutto il tempo. Ciò significa che avrai modelli di dati che corrispondono a Views e i modelli di visualizzazione probabilmente assomiglieranno molto a quei modelli di dati. Quando è possibile estrarre i dati direttamente dalla tabella, utilizzare il modello di dati standard per la tabella e mappare su un modello di vista. –

+0

Forse ha senso. Ma immaginiamo la situazione in cui le mie domande hanno il paging. Dove lo applicheresti? –

Problemi correlati