MVC4 Modelli di controller di servizio

1

Sto lavorando su un'applicazione MVC4 N-tier e ho una breve domanda sulla relazione Service to Controller e utilizzo di Domain / ViewModel.

   public ActionResult Details(int id = 0)
    {
        TenantDomainModel tenant = _tenantService.GetById(id);
        TenantViewModel tenantViewModel = Mapper.Map<TenantViewModel>(tenant);
        return View(tenantViewModel);
    }

Come puoi vedere il mio servizio restituisce un DomainModel che il mio controller usa per creare un ViewModel usando Automapper.

C'è un modo migliore per farlo? Idealmente mi piacerebbe non avere alcun modello di dominio referenziato nel mio strato Presentation / Web ma non sono le migliori pratiche esatte su questo specifico punto.

Grazie

    
posta Pxl 07.04.2013 - 05:04
fonte

3 risposte

1

La risposta è ... dipende da cosa intendi. Se stai cercando di ottenere un codice scalabile, la best practice consiste in genere nella creazione di un Domain Transfer Object (DTO) che è una vista nello stato corrente. Questo viene fatto di solito nei servizi stessi e viene rigenerato ogni volta che cambia l'oggetto del dominio (la consistenza finale è fondamentale, poiché il tentativo di mantenere la coerenza in ogni momento non accadrà). Il DTO è ottimizzato per la query che serve così come i dati che si intende visualizzare, può essere un composto di più di un oggetto dominio. Ma soprattutto è indipendente dall'oggetto dominio e non è a conoscenza dell'oggetto dominio. Potrebbe sembrare contraddittorio, ma non lo è. Suggerisco vivamente di leggere su Command Query Response Segregation (CQRS) in quanto è probabilmente l'approccio migliore a quello che stai facendo.

CQRS ti consente di rendere il tuo sito web (o qualsiasi cliente) agnostico al tuo dominio. Questo è importante in quanto il modello di dominio deve gestire internamente le proprie regole aziendali e non dovrebbe fare affidamento su un consumatore esterno per garantire coerenza e correttezza. Per quanto riguarda il sito Web, il dominio è il DTO progettato specificamente per le sue query. Quando hai bisogno del tuo sito web per poter cambiare il tuo dominio esponi i comandi che invia ai servizi con l'id dell'entità di dominio e i dati rilevanti solo per quel comando. I servizi eseguono quindi il comando o restituiscono un risultato dicendo che non erano in grado di farlo.

Ora la risposta completa qui deve venire con l'avvertenza di: se si tratta di un'applicazione interna solo a basso utilizzo, è necessario decidere se avere un modello di dominio / query scalabile conta più della velocità di completamento. Avete bisogno del sistema in fretta, o avete bisogno che il sistema sia veloce e scalabile.

    
risposta data 07.04.2013 - 14:42
fonte
0

Un buon modo per tenere questi problemi fuori dai modelli di servizio è creare metodi di estensione nel progetto web per gestire le attività di mappatura. Inoltre li rende molto più facilmente testabili in isolamento.

    
risposta data 07.04.2013 - 14:50
fonte
0

Ho appena trascorso un po 'di tempo usando DTO tra il livello Controller / Service, era abbastanza facile e abbastanza efficiente (specialmente con Automapper).

Ora ho un'altra domanda riguardante l'utilizzo di DTO tra Service > Strato di data Sto usando un modello UOW con repository generici che restituiscono POCO. C'è qualche pratica migliore qui? Mi rendo conto che in pratica il mio livello di dati sanguina sul livello aziendale.

Posso vedere che idealmente il mio repository può restituire DTOS per avere una perfetta separazione tra i livelli, ma sto guardando un esempio pratico. Mi chiedo solo di poter mantenere un approccio generico al repository che restituisca DTO.

Grazie per l'aiuto!

    
risposta data 07.04.2013 - 23:24
fonte

Leggi altre domande sui tag