2012-08-22 12 views
5

Estoy tratando de implementar este Command Pattern en mi aplicación .NET MVC 3, específicamente para guardar ediciones en un Thing. Estoy indeciso sobre cómo proceder. Antes de entrar a la pregunta real, aquí está el código simplificado:Patrón de comando en .NET MVC 3 (eliminación de basura del controlador)

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... 
    } 
} 

Mi EditThingViewModel es totalmente desconectado de mi dominio, que consiste en clases POCO. Parece que mi EditThingCommand debería tener este aspecto:

public class EditThingCommand 
{ 
    Thing ModifiedThing; 
} 

Sin embargo, la construcción de ModifiedThing sería entonces todavía estar sucediendo en mi controlador. Esa es la mayoría del trabajo en este caso. Para cuando se construye ModifiedThing (y se le aplica la marca de tiempo "antigua" para una comprobación de concurrencia optimista), todo lo que queda es que el comando llame a Actualizar en mi contexto de datos.

Claramente hay valor en poder decorarlo fácilmente con otros comandos, pero También me gustaría poder mover la construcción de ModifiedThing fuera de mi controlador. (Quizás esta pregunta realmente sea solo eso). EditThingCommand está en mi dominio y no tiene una referencia a EditThingViewModel, por lo que no puede ir allí. ¿Tiene sentido tener otro comando en mi capa de presentación para asignar mi viewmodel a mi entidad poco?

+0

Sugeriría revisar el artículo de Paul Stovell Limpiar los controladores ASP.NET MVC encontrados en http://www.paulstovell.com/clean-aspnet-mvc-controllers –

+0

¡Gracias por la sugerencia! –

Respuesta

0

Después de varios meses de usar este patrón en otros proyectos, es evidente para mí que los comandos en este proyecto en particular eran simplemente demasiado generales y, por lo tanto, demasiado complejos y requerían demasiada configuración. Hubiera sido mejor crear, por ejemplo, un EditThingTitleCommand y un MoveThingPiecesCommand y así sucesivamente, y llamarlos desde sus propios ActionMethods.

En otras palabras, al usar el patrón de comando, no use simplemente los comandos como reemplazos para operaciones CRUD típicas. Con más especificidad viene más beneficio.

0

Creé un EditThingPostCommand fuera de mi dominio, que toma EditThingViewModel como parámetro. EditThingPostCommandHandler es responsable de crear EditThingCommand y llamar a su controlador.

Funciona, pero no voy a suponer que es la mejor respuesta a mi pregunta. Podría decirse que la mayor parte de lo que está haciendo EditThingPostCommandHandler podría hacerse en una configuración personalizada de AutoMapper, que aún serviría para limpiar el método de acción del controlador.

Cuestiones relacionadas