2012-08-22 11 views
5

Sto cercando di implementare questo Command Pattern nell'applicazione .NET MVC 3, in particolare per il salvataggio delle modifiche su una cosa. Sono indeciso su come procedere. Prima di arrivare alla domanda reale, ecco il codice semplificato:Modello di comando in .NET MVC 3 (rimozione della posta indesiderata dal controller)

public class ThingController 
{ 
    private readonly ICommandHandler<EditThingCommand> handler; 

    public ThingController(ICommandHandler<EditThingCommand> handler) 
    { 
     this.handler = handler; 
    } 

    public ActionMethod EditThing(int id) 
    { 
     ...build EditThingViewModel and return with View... 
    } 

    [HttpPost] 
    public ActionMethod EditThing(int id, EditThingViewModel vm) 
    { 
     var command = new EditThingCommand 
     { 
      ...not sure yet... 
     }; 

     this.handler.Handle(command); 

     ...redirect somewhere... 
    } 
} 

mio EditThingViewModel è del tutto scollegato dal mio dominio, che si compone di classi POCO. Sembra che la mia EditThingCommand dovrebbe assomigliare a questa:

public class EditThingCommand 
{ 
    Thing ModifiedThing; 
} 

Tuttavia, la costruzione ModifiedThing sarebbe quindi ancora accadendo nel mio controller. Questa è la maggior parte del lavoro in questo caso. Al momento della costruzione di ModifiedThing (e del timestamp "vecchio" ad esso applicato per il controllo ottimistico della concorrenza), tutto ciò che rimane è che il comando chiami Update nel mio contesto di dati.

Chiaramente c'è un valore nel poterlo decorare facilmente con altri comandi, ma Vorrei anche essere in grado di spostare la costruzione di ModifiedThing al di fuori del mio controller. (Forse questa domanda riguarda proprio questo.) EditThingCommand è nel mio dominio e non ha riferimenti a EditThingViewModel, quindi non può andare lì. Ha senso avere un altro comando nel mio livello di presentazione per mappare il mio viewmodel alla mia piccola entità?

+0

Suggerirei di guardare oltre l'articolo di Paul Stovell Pulire i controller MVC ASP.NET trovati su http://www.paulstovell.com/clean-aspnet-mvc-controllers –

+0

Grazie per il suggerimento! –

risposta

0

Dopo diversi mesi di utilizzo di questo modello su altri progetti, è chiaro che i comandi su questo particolare progetto erano semplicemente troppo generali e quindi troppo complessi, richiedendo troppa installazione. Sarebbe stato meglio creare, ad esempio, un EditThingTitleCommand e un MoveThingPiecesCommand e così via, e chiamarli dai propri ActionMethods.

In altre parole, quando si utilizza lo schema di comando, non utilizzare semplicemente i comandi come sostituti per le tipiche operazioni CRUD. Con più specificità viene più beneficio.

0

Ho creato un EditThingPommCommand al di fuori del mio dominio, che accetta EditThingViewModel come parametro. EditThingPostCommandHandler è responsabile della creazione di EditThingCommand e della chiamata al gestore.

Funziona, ma non ho intenzione di supporre che sia la migliore risposta alla mia domanda. Probabilmente la maggior parte di ciò che EditThingPommCommandHandler sta facendo potrebbe essere eseguita in una configurazione AutoMapper personalizzata, che avrebbe comunque lo scopo di eliminare il metodo di azione del controller.

Problemi correlati