Question

J'ai été donné pour développer une application web qui peut avoir plusieurs couches de présentation, actuellement son sur le Web, mais bientôt sur les ordinateurs de bureau et d'autres plates-formes. Donc, je cherchai autour sur la façon de le faire mieux. J'ai trouvé que son préférable d'utiliser une approche à plusieurs niveaux.

Je pense avoir BLL comme un service Web qui est accessible par différents Pls. Le BLL accédera DAL pour les opérations spécifiques de données. Jusqu'à présent, si bon, mais je pensais à l'aide ASP.NET MVC pour l'application Web. Maintenant, je suis un peu confus parce que les « contrôleurs » contiennent essentiellement la logique métier, à droite. Est-ce une bonne option ? Si je fais suivre le même chemin, en utilisant MVC et les couches contiennent mentionnées ci-dessus, mes contrôleurs wont nécessairement le BLL mais ne seront, un peu mannequins.

Est-ce la bonne façon de le faire?

Était-ce utile?

La solution

Ce sont les couches recommandées:

  • Présentation (MVC, WPF, peu importe): contient la logique que de présentation (comprend jamais la logique métier), le contrôleur de communication que la poignée avec la couche application / services à coordonner la communication.

  • Services Distribués (façade à distance): que vous aurez beaucoup de clients, certains d'entre eux seraient des fenêtres des applications et d'autres sont des applications Web, il est recommandé de créer une couche de service à distance (services WCF ou services Web) qui expose la couche d'affaires aux consommateurs (envoyer de préférence et recevoir DTO).

  • couche d'application: une couche qui gère la communication avec la couche de domaine, et la logique de transaction de coordonner et de services techniques, et si vous utilisez DTO il se traduit par des objets de domaine en DTO et vice versa

  • Couche Domaine: contient des entités et des objets de valeur, ceci est le noyau de logique d'entreprise conçu en termes d'objets de domaine orienté objet d'encapsulation de données et la logique. Il pourrait également contient des interfaces du référentiel si vous utilisez modèle référentiel. et des services de domaine pour la logique qui ne rentre pas dans une seule entité.

  • Accès aux données: en utilisant comme ORM NHibernate ou EF ou quelles que soient les techniques d'accès aux données à la carte des entités dans les tables de base de données.

  • Infrastructure / commune
  • : le code de l'infrastructure et transversaux services techniques tels que l'enregistrement

Je vais essayer de donner un petit exemple sur chaque couche: un exemple hypothétique incomplète dire que vous souhaitez activer un ordre d'achat

Couche présentation (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);
  }
}

couche de service distribué (Service 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(
  }
}

Couche d'application:

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

Couche Domaine:

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

     .....
  }
}

Référentiels (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
  }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top