2012-07-16 7 views

risposta

10

Ho bisogno di mappare ViewModel ad entità, non è sicuro che livello è quello giusto per mettere il codice.

controller naturalmente. I livelli di servizio e repository non sanno cosa significa un modello di vista . Manipolano solo i modelli di dominio.

Quindi all'interno del controller si utilizza la chiamata .Map<TSource, TDest> per eseguire la mappatura avanti e indietro tra un modello di dominio e modelli di viste. Ma la definizione di mappatura stessa (chiamata .CreateMap<TSource, TDest>) viene eseguita una volta per la durata di AppDomain, idealmente in un Profile.

Quindi prendiamo in considerazione un paio di flussi di lavoro tipici all'interno di un'azione di controllo in termini RESTful

GET (SELECT in RDBMS termini):

  1. controllore interroga il livello di servizio per recuperare un modello di dominio (un aggregato root nella maggior parte delle situazioni)
  2. controller chiama il livello di mappatura per mappare il modello di dominio a un modello di vista
  3. controller passa il modello di vista alla vista

PUT (INSERTO in termini RDBMS):

  1. controllore riceve un modello vista dalla vista come argomento di azione
  2. controllore associa il modello immagine per un modello di dominio
  3. regolatore passa il modello di dominio al livello di servizio per l'elaborazione
  4. controllore reindirizza ad un'azione GET

DELETE (DELETE in termini RDBMS)

  1. controllore riceve un ID come parametro di azione
  2. regolatore passa l'id di livello di servizio alla trasformazione (cancellazione)
  3. controllore reindirizza ad un'azione GET

POST (UPDATE in termini RDBMS):

  1. il controllore riceve un modello di vista dalla vista come argomento
  2. il controller interroga il livello di servizio per ottenere un modello di dominio che si desidera aggiornare utilizzando l'ID univoco contenuto nel modello di vista
  3. aggiornamenti del controller solo le proprietà del modello di dominio che è stato recuperato che sono presenti anche nel modello di visualizzazione. Ad esempio, il modello di dominio potrebbe consistere in proprietà Username e IsAdmin e il modello di visualizzazione sarà ovviamente costituito solo da una proprietà Username. Quindi lasciamo intatta la proprietà IsAdmin sul modello di dominio e aggiorniamo la proprietà Username. In termini Automapper questo si traduce il seguente overload vuoto del metodo .Map<TSource, TDest>: Mapper.Map<ADomain, ViewModel>(domainInstanceControllerRetrievedUsingTheId, viewModelInstancePassedAsArgument);
  4. regolatore passa il modello di dominio aggiornato per il livello di servizio alla trasformazione (update)
  5. controllore reindirizza ad un'azione GET

Armati con questi 4 flussi di lavoro sei pronto per il mondo CRUD.

P.S. Un promemoria REST:

Create = PUT 
Retrieve = GET 
Update = POST 
Delete = DELETE 
+0

grazie mille per la nostra risposta dettagliata. mi ha davvero aiutato a capire come dovrebbe funzionare. – qinking126

+1

Se si mappano i modelli di visualizzazione alle entità all'interno del controller (livello applicazione MVC), è necessario fare riferimento alle entità (il livello dati) nel livello MVC, che è una cosa negativa in base a molte risposte qui su SO. Si dice spesso che non dovresti affinare le tue entità al di fuori del tuo livello dati. Opinioni? –

+1

@MohammadSepahvand, non è male fare riferimento alle entità o al livello dati all'interno del livello MVC. Ecco a cosa serve un livello dati - da riutilizzare in diversi tipi di applicazioni. Ciò che è male è passare quelle entità alle opinioni. –

Problemi correlati