2012-05-03 10 views
6

Me gusta la idea de Command Query Separation pero no puedo ver cómo usarla dentro de una acción MVC Controller que agrega una entidad y necesita la ID de la nueva entidad después de agregarla.Usando el principio de separación Command-Query en Controladores MVC

Por ejemplo, en el ejemplo simplificado por debajo de un servicio se utiliza para crear un nuevo elemento:

public ActionResult Assign(AssignViewModel viewModel) 
{ 
    var newItem = _AssignItemService.AssignItem(viewModel.ItemName, viewModel.ItemValue); 

    return RedirectToAction("ListItem", new {id = newItem.Id); 
} 

Pero cuando vuelvo a dirigir a la acción que se va a mostrar el nuevo elemento, necesito saber la ID del elemento recién creado, para que pueda ser recuperado de la base de datos. Así que tengo que pedirle al servicio que devuelva el artículo recién creado (o al menos, su ID).

En CQS puro, un comando no tiene valor de retorno, por lo que el patrón anterior no sería válido.

Cualquier consejo recibido con gratitud.

Respuesta

4

Debe pasar al método AssignItem una instancia de "Artículo" (o el nombre de su entidad) creada a partir de los valores del modelo de vista, entonces el método no tiene que devolver nada, en su lugar solo actualizará la propiedad de Id de la entidad Es un método de comando.

entonces usted puede utilizar para cualquier cosa entity.Id desea

+0

¿Cómo recuperas el "artículo" más tarde? –

+0

el objeto que se pasa al método AssignItem contiene la información Id una vez que se devuelve. Como el método es un comando, está bien cambiar el estado del objeto – jorgehmv

+0

¿Todavía no estás devolviendo un valor en ese punto? Claro, no está saliendo por la parte de atrás de la función, pero todavía estás devolviendo un valor, solo estás presionando el valor de retorno en otro lugar. Dicho esto, me gusta la idea de mantener el ID dentro del objeto, en lugar de devolverlo por separado. –

8

Creo que estás atrapado en un punto pedante.

Una consulta es cuando desea hacer una pregunta a la base de datos, como "¿Cuántos clientes al oeste de Mississippi compraron artículos de color rojo durante el mes de junio?" Esa es una consulta. Devolver el ID durante un inserto no es una consulta típica, per se.

Como con la mayoría de las otras cosas en el desarrollo de software, este patrón no es un absoluto. Incluso Fowler dice que está dispuesto a romper cuando es conveniente hacerlo:

hace estallar una pila es un buen ejemplo de un modificador que modifica el estado. Meyer dice correctamente que puede evitar tener este método, pero es un modismo útil. Así que prefiero seguir este principio cuando puedo, pero Estoy dispuesto a romperlo para obtener mi pop.

Si realmente desea recuperar la ID más recientemente agregada de una base de datos separada de su inserción, puede usar algo como Scope Identity. Pero creo que estás agregando complejidad sin ningún beneficio adicional.

+0

Además, asegúrese de que si usa Scope identity o similar maneja las situaciones de subprocesos múltiples correctamente. Por ejemplo, las inserciones 'T1', las inserciones' T2', 'T1' obtienen' Id' de la inserción 'T2's,' T2' obtiene la misma Id. Por supuesto, el mismo problema se aplica a cualquier operación/transacción atómica, así que estoy seguro de que ha considerado esto. – Basic

+0

Otra buena razón para simplemente dejar que la base de datos le proporcione el ID a través del valor de retorno de la función de inserción. –

+0

Creo que el comentario de Fowler tiene en cuenta que el método pop en una pila está bien ya que su uso es general, por lo que se ha convertido en una expresión idiomática para todos los desarrolladores, pero no considero que devolver una identificación desde un método de guardar sea una expresión idiomática. Aunque estoy de acuerdo con usted en que nada es absoluto y que no es gran cosa romper este tipo de reglas de vez en cuando – jorgehmv

0

La manera de hacerlo sería hacer la persona que llama especificar el ID de la nueva entidad (que muy probablemente implica el uso de GUID como clave).

Sin embargo, en mi experiencia, imponer la regla (purista) de que un comando puede no devolver un resultado va a causar problemas con poca ganancia.

+0

Gracias erikkallen. Tiene sentido, pero al final creo que la idea de jorgehmv funcionará mejor para mí. – Appetere

Cuestiones relacionadas