2009-09-29 13 views
11

Actualmente estoy trabajando en un proyecto de sitio web de ASP.net MVC.¿Dónde colocar las funciones que me ayudan a ejecutar las tareas del controlador?

He puesto todas las cosas relacionadas con la base de datos en mi modelo, como las consultas y las funciones de actualización/eliminación/guardado.

También creé un par de controladores que ejecutan la lógica. Agregué un espacio de nombres de Ayudantes y dentro de ese espacio de nombres hay algunas clases que contienen lógica para paginación, internacionalización, etc.

Me preguntaba cuál es la mejor práctica para colocar funciones y clases que hacen algunas cosas generales, como generar una factura ?

+0

Si pudiera, daría esta pregunta +100 votos. Realmente quiero saber cómo otras personas abordan este problema. Acabo de comenzar a experimentar con ASP.NET MVC (en un proyecto de tamaño medio), y me encuentro arrinconado a menudo por la estructura del directorio y algunos de los conceptos de MVC. –

Respuesta

4

Como expresé en un comentario anterior, estoy demasiado interesado en esta pregunta.

En primer lugar, parece incorrecto crear directorios adicionales (para las otras clases y utilidades) directamente en su proyecto ASP.NET MVC. Además, no creo que deba ser modelo. Para mí, el modelo es más o menos clases de datos que de alguna manera representa la base de datos (o los datos que estamos tratando de modelar). Además de eso, a menudo la funcionalidad comercial (o las piezas de código "reales" en su aplicación) trata varias clases de modelos a la vez, por lo que puede no haber un lugar natural para ella en alguna clase de modelo.

así que creo que estoy inclinando hacia el siguiente esquema:

  • Haga acciones del controlador muy pequeño; solo unas líneas de código cada una.
  • Mantener modelo simple y en su mayoría sin función, y ponerlo en un proyecto separado .
  • Ponga todos su código que hace todo el trabajo "real" (la "capa de negocios") en un proyecto separado.

De esta manera tendrá total libertad para elegir sus propios espacios de nombres, podrá crear cualquier cantidad de clases de utilidad, funciones y generalmente podrá estructurar su código como desee sin estar restringido por ASP. NET MVC.

Esto es solo una idea. Por el momento estoy trabajando en mi primera aplicación ASP.NET MVC más grande. Así que en realidad voy a aprender si esto funciona en la práctica y cómo funciona.

+0

Creo que pondré todo el trabajo real en un proyecto separado. – jao

0

Puede considerar la posibilidad de crear algunos servicios que usted inyecta en sus controladores.

Es una pregunta demasiado amplia.

+0

¿Qué quieres decir exactamente? ¿Tiene enlaces a ejemplos? – jao

+0

http://en.wikipedia.org/wiki/Business_logic_layer –

+0

@jao ¿estás usando Dependency Injection? hay muchos ejemplos por ahí. mira la arquitectura s # arp para un – dove

0

Este tipo de lógica comercial debe estar en algún lugar de su modelo.

Sin embargo, me parece que cuando hay algo que realmente no "encaja" en ninguna parte, y podría estar tentado de crear una clase de Utilidades, este suele ser un buen lugar para utilizar los métodos de Extensión.

¿Quizás pueda agregar métodos de extensión en su conjunto de datos para ayudarlo con la paginación?

0

Realmente necesita la mejor práctica, considere mirar Domain Driven Design. No se adapta a todos los proyectos y requiere buenas habilidades de OOP, pero creo que es sin dudas una "mejor práctica" ... siempre que pueda pagarlo ;-)

Observe que ya viola DDD ya que usa el patrón de registro activo (ponga la lógica de persistencia en las entidades). Por lo tanto, no digo que tenga para seguir DDD. Pero será útil grok de todos modos.

0

Tengo clases de modelos que tienen Crud y Poco como tú.

Aparte de eso, tengo Viewmodels que se usan para las vistas tipadas.

Mis Viewmodels son bastante grandes y se utilizan en un par de vistas (alrededor de 10-15 modelos de vista para toda la aplicación). En mi aplicación, estos ViewModels terminaron siendo el lugar perfecto para el código que parecía ser grande y repetitivo para las acciones del controlador.

Por ejemplo, tengo cierta lógica que está muy cerca de la interfaz de usuario cuando agrego un producto al carrito. Ahora tengo un método en ViewModel: AddToCart (IProductService productService, ICartService cartService).

0

Creo que la mejor solución a esta pregunta sobre la práctica es: Ponga la lógica en el Modelo si se va a usar en los controladores. Si es específico del controlador, solo colóquelo en su controlador. Cuando digo el Modelo, este podría ser un proyecto separado que concuerde con su Modelo de Datos de Entidad, o podría ser un Modelo de Vista, o podría ser solo la carpeta Modelos de su proyecto MVC.

Cuestiones relacionadas