asp.net mvc - tutorial - ¿Cómo crear una capa de servicio para mi aplicación MVC?
tutorial asp net mvc (5)
Citar de "lógica de negocios debe estar en un servicio, no en un modelo"? :
En una arquitectura MVP / MVC / MVVM / MV *, los servicios no existen en absoluto. O si lo hacen, el término se usa para referirse a cualquier objeto genérico que pueda ser inyectado en un controlador o modelo de visualización. La lógica de negocios está en tu modelo. Si desea crear "objetos de servicio" para orquestar operaciones complicadas, eso se ve como un detalle de implementación. Mucha gente, por desgracia, implementa MVC de esta manera, pero se considera un antipatrón (Modelo de dominio anémico) porque el modelo en sí no hace nada, es solo un conjunto de propiedades para la interfaz de usuario.
Algunas personas piensan erróneamente que tomar un método de control de 100 líneas y meterlo todo en un servicio de alguna manera contribuye a una mejor arquitectura. Realmente no lo hace; todo lo que hace es agregar otra capa de indirección, probablemente innecesaria. En términos prácticos, el controlador todavía está haciendo el trabajo, solo lo hace a través de un objeto "auxiliar" mal llamado. Recomiendo encarecidamente la presentación de Wicked Domain Models de Jimmy Bogard para un claro ejemplo de cómo convertir un modelo de dominio anémico en uno útil. Implica un examen cuidadoso de los modelos que está exponiendo y qué operaciones son realmente válidas en un contexto comercial.
Por lo que entiendo, MVC separa las definiciones de clase (modelo) de la presentación (vista) a través del "pegamento" que es el controlador. El controlador debe tener una sola responsabilidad y, por lo tanto, ser comprobable. ViewModels se utilizan para reunir datos de varias entidades y para "dar masajes" a los datos del controlador de la vista.
Parece que la lógica empresarial realmente no tiene cabida ... así que estoy pensando que otra capa de servicios sería adecuada. Simplemente no estoy seguro de dónde colocar esta capa, o cómo crear los servicios. ¿Debería ser una clase llamada "servicios" que contenga un conjunto de funciones? Soy un poco nuevo en MVC, por lo que cualquier tipo de material de lectura, muestras o consejos para recién llegados sería increíble.
Mi consejo es crear clases separadas llamadas "servicios". Póngalos en un proyecto de biblioteca de clases diferente (o espacio de nombres) y hágalos independientes en la infraestructura de marcos de MVC. Recomiendo usar también algún tipo de inyección de dependencia (lo mejor es la inyección de constructor). Entonces sus clases de servicio pueden verse así:
public class MyService : IMyService
{
IFirstDependency _firstService;
ISecondDependency _secondService;
public MyService(IFirstDependency firstService, ISecondDependency secondService)
{
}
public Result DoStuf(InputDTO)
{
// some important logic
}
}
Entonces usted consume estos servicios de sus controladores. Mire here para el ejemplo completo.
Según los repositorios, mi consejo es que no los utilicen si va a utilizar algún ORM moderno (NHibernate, EntityFramework), ya que su lógica empresarial estará encapsulada en la capa de servicio y su base de datos ya estará encapsulada con el marco ORM.
Parece que estarías buscando algo así como un patrón de repositorio. Usted puede leer sobre ello aquí:
Esta respuesta aquí también puede ayudar:
Usualmente uso una capa de servicio al desarrollar la aplicación ASP.NET MVC. Es similar al patrón de la capa de servicio que Martin Fowler analiza en Patterns of Enterprise Application Architecture . Encapsula la lógica de su negocio y hace que los controladores sean bastante delgados. Básicamente, los controladores usan la capa de servicio para obtener los modelos de dominio que luego se transforman en modelos de vista. También utilizo el patrón de diseño de la unidad de trabajo para manejar las transacciones y el patrón de diseño del repositorio para encapsular la capa de acceso a los datos para facilitar la prueba de la unidad y poder intercambiar fácilmente los ORM. Esta figura muestra las capas típicas que uso en una aplicación MVC.
La capa de servicio está etiquetada como la "Capa de aplicación o dominio" en este diagrama porque encuentro personas confundidas cuando usa el término "Capa de servicio". Tienden a pensar que este es un servicio web. En realidad, es un ensamblaje que puede usar su tecnología de servicio web favorita, como ASP.NET Web API o WCF, además de un controlador.
En cuanto a las convenciones de nomenclatura, generalmente utilizo algo que describe el dominio seguido del servicio. Por ejemplo, si tengo una capa de servicio que maneja membresía de usuario, entonces tendría una clase llamada MembershipService que tiene todos los métodos necesarios para que los controladores y los servicios web consulten y manipulen el dominio de membresía. Tenga en cuenta que puede tener varios dominios en la misma aplicación para que pueda tener varias capas de servicio. Mi punto aquí es que no tienes que tener un solo servicio monolítico que se encargue de toda la aplicación.