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):
- controllore interroga il livello di servizio per recuperare un modello di dominio (un aggregato root nella maggior parte delle situazioni)
- controller chiama il livello di mappatura per mappare il modello di dominio a un modello di vista
- controller passa il modello di vista alla vista
PUT
(INSERTO in termini RDBMS):
- controllore riceve un modello vista dalla vista come argomento di azione
- controllore associa il modello immagine per un modello di dominio
- regolatore passa il modello di dominio al livello di servizio per l'elaborazione
- controllore reindirizza ad un'azione GET
DELETE
(DELETE in termini RDBMS)
- controllore riceve un ID come parametro di azione
- regolatore passa l'id di livello di servizio alla trasformazione (cancellazione)
- controllore reindirizza ad un'azione GET
POST
(UPDATE in termini RDBMS):
- il controllore riceve un modello di vista dalla vista come argomento
- 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
- 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);
- regolatore passa il modello di dominio aggiornato per il livello di servizio alla trasformazione (update)
- 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
fonte
2012-07-16 21:29:41
grazie mille per la nostra risposta dettagliata. mi ha davvero aiutato a capire come dovrebbe funzionare. – qinking126
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? –
@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. –