Pregunta

Me han dado para desarrollar una aplicación web que pueda tener múltiples capas de presentación, actualmente está en la web, pero pronto estará en escritorios y otras plataformas. Así que busqué cómo hacerlo mejor. He descubierto que es mejor usar un enfoque en capas.

Estoy pensando en tener BLL como un servicio web al que podría acceder a diferentes PLS. El BLL accederá a DAL para operaciones específicas de datos. Hasta ahora todo bien, pero estaba pensando en usar ASP.NET MVC para la aplicación web. Ahora estoy un poco confundido porque los "controladores" esencialmente contienen la lógica de negocios, correcto. Es una buena opción ? Si sigo la misma ruta, usando MVC y las capas mencionadas anteriormente, mis controladores no necesariamente contienen el BLL, sino que solo serán, un poco mancos.

¿Es la forma correcta de hacerlo?

¿Fue útil?

Solución

Estas son las capas recomendadas:

  • Presentación (MVC, WPF, lo que sea): Contiene solo la lógica de presentación (nunca incluye la lógica de negocios) El controlador solo maneja la comunicación con la capa de aplicación/servicios para coordinar la comunicación.

  • Servicios distribuidos (fachada remota): como tendrá muchos clientes, algunos de ellos serían aplicaciones de Windows y otras son aplicaciones web, se recomienda crear una capa de servicio remoto (servicios WCF o servicios web) que expone la capa comercial a los consumidores ( preferible enviar y recibir DTO).

  • Capa de aplicación: una capa que maneja la comunicación con la capa de dominio y coordinar los servicios técnicos y la lógica de transacciones, y si está utilizando DTO, traduce objetos de dominio en DTO y viceversa

  • Capa de dominio: contiene entidades y objetos de valor, este es el núcleo de la lógica de negocios diseñada en términos de objetos de dominio orientados a objetos que encapsulan los datos y la lógica. También podría contener interfaces de repositorio si se usa el patrón de repositorio. y servicios de dominio para lógica que no encajan en una sola entidad.

  • Acceso a datos: utilizando ORM como NHibernate o EF o cualquier técnica de acceso a datos para asignar entidades en tablas de bases de datos.

  • Infraestructura / Común: Código de infraestructura y servicios técnicos de corte cruzado como el registro

Intentaré dar un pequeño ejemplo sobre cada capa: un ejemplo hipotético incompleto, diga que desea activar una orden de compra.

Capa de presentación (MVC):

public class PurchaseOrderController
{
  public ActionResult ActivateOrder(int id)
  {
    var response = _orderManagementService.ActivateOrder(id); // Call distributed service (Web Service)

    if(response.Succeed)
      return new SuccessActionResult();
    else
      return new FailedActionResult(response.Reason);
  }
}

Capa de servicio distribuido (servicio web):

public class OrderManagementWebService : IOrderManagementService
{
  private readonly IOrderExecutionService _orderService;

  public OrderManagementWebService(IOrderExecutionService orderService)
  {
    _orderService = orderService; // Order Service from application service
  }

  public ActivationResult ActivateOrder(int id)
  {
    var response = _orderService.ActivateOrder(id); // Call the application layer to execute the logic
    if(
  }
}

Capa de aplicación:

public class OrderExecutionService : IOrderExecutionService
{
  private IOrderRepository _orderRepository;

  public OrderExecutionService(IOrderRepository orderRepository)
  {
    _orderRepository = orderRepository;
  }

  public ActivationResult ActivateOrder(int id)
  {
    var order = _orderRepository.GetById(id); // Get the order from repository

    try
    {
      order.Activate(); // Call business logic inside the order entity
      return new ActivationResult { Success = true } ;
    }
    catch(ActivationException ex)
    {
      LogFactory.GetLog().Exception(ex); // Call log from infrastructure layer
      return new ActivationResult { Success = false, Reason = ex.Message } ;
    }
  }
}

Capa de dominio:

public class PurchaseOrder : Entity
{
  // Properties and fields (Data)
  public int Id { get; private set; }
  public Customer Customer { get; private set; }

  // Methods (contains business logic)
  public void Activate()
  {
     if(Customer.IsBlacklisted)
       throw new InvalidCustomerException(...);

     if(_lineItems.Count == 0)
       throw new NoItemsException(...);

     this.SetStatus(OrderStatus.Active);

     .....
  }
}

Repositorios (capa de acceso a datos):

public class OrderRepository : IOrderRepository
{
  public PurchaseOrder GetById(int id)
  {
    // data access code to access ORM or any data access framework.
  }
}

Infraestructura:

public class Logger : ILogger
{
  public void Exception(Exception ex)
  {
   // write exception to whatever
  }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top