Domanda

mi è stato dato di sviluppare un'applicazione web che può avere più livelli di presentazione, attualmente la sua sul web, ma che presto saranno su desktop e altre piattaforme. Così ho cercato in giro su come farlo meglio. Ho scoperto che è meglio utilizzare un approccio a più livelli.

Sto pensando di avere BLL come un servizio web che potrebbe essere accessibile da diversi pls. Il BLL sarà accede DAL per le operazioni di dati specifici. Fin qui tutto bene, ma stavo pensando di utilizzare ASP.NET MVC per il web app. Ora sono un po 'confusa, perché i "controllori" contengono essenzialmente la logica di business, a destra. E 'una buona opzione? Se faccio seguire lo stesso percorso, utilizzando MVC e gli strati di cui sopra, i miei controllori Wont necessariamente contengono la BLL, ma sarà solo, un po 'manichini.

E 'il modo giusto per farlo?

È stato utile?

Soluzione

Questi sono gli strati raccomandati:

  • Presentazione (MVC, WPF, a prescindere): contiene la logica Presentation (mai include la logica di business) la centralina solo comunicazione maniglia con applicazioni / servizi di livello per la comunicazione coordinata.

  • Distributed Services (Remote facciate): come avrete molti clienti, alcuni dei quali sarebbero applicazioni Windows e gli altri sono applicazioni web, si consiglia di creare un livello a distanza di servizi (servizi WCF o servizi web), che espone strato di business per i consumatori (invio preferibile e ricezione DTOs).

  • Application Layer: uno strato che gestisce la comunicazione con lo strato del dominio, e la logica delle transazioni coordinare e servizi tecnici, e se si sta utilizzando DTOs si traduce in oggetti di dominio DTOs e viceversa

  • Livello Domain: contiene entità e oggetti di valore, questo è il nucleo della logica di business progettato in termini di oggetti di dominio object oriented che incapsulano dati e la logica. Anche potrebbe contiene interfacce repository se usando il modello repository. e dei servizi del dominio a logiche che non rientra in una singola entità.

  • Accesso ai dati: utilizzando ORM come NHibernate o EF o qualsiasi tecniche di accesso ai dati per mappare le entità in tabelle di database.

  • Infrastrutture / Comune: codice di infrastruttura e taglio trasversale servizi tecnici come la registrazione

I cercherà di dare un piccolo esempio su ogni strato: un esempio incompleta ipotetica dire che si desidera attivare un ordine di acquisto

Presentation Layer (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);
  }
}

Distributed Service Layer (Web Service):

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

Application Layer:

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

Livello Domain:

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);

     .....
  }
}

Repositories (Data Access Layer):

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

Infrastrucute:

public class Logger : ILogger
{
  public void Exception(Exception ex)
  {
   // write exception to whatever
  }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top