Frage

Ich habe eine Webanwendung mit mehreren Präsentationsebenen entwickelt, die derzeit im Internet sind, aber bald auf Desktops und anderen Plattformen sein kann. Also suchte ich herum, wie man es am besten kann. Ich habe festgestellt, dass es besser ist, einen geschichteten Ansatz zu verwenden.

Ich denke, BLL als Web-Service zu haben, auf den verschiedene PLs zugegriffen werden können. Der BLL zugreift auf DAL für datenspezifische Vorgänge. So weit so gut, aber ich habe darüber nachgedacht, ASP.NET MVC für die Web -App zu verwenden. Jetzt bin ich ein bisschen verwirrt, weil die "Controller" im Wesentlichen die Geschäftslogik enthalten, richtig. Ist es eine gute Option? Wenn ich dem gleichen Pfad unter Verwendung von MVC und den oben genannten Schichten folge, enthalten meine Controller nicht unbedingt das BLL, aber es werden nur dumm sein.

Ist es der richtige Weg, es zu tun?

War es hilfreich?

Lösung

Dies sind die empfohlenen Schichten:

  • Präsentation (MVC, WPF, was auch immer): Enthält nur Präsentationslogik (nie in der Geschäftslogik). Der Controller bearbeitet nur die Kommunikation mit Anwendungs-/Servicesschicht, um die Kommunikation zu koordinieren.

  • Distributed Services (Remote -Fassade): Da Sie viele Kunden haben, sind einige von ihnen Windows -Apps und andere Web -Apps. Es wird empfohlen, eine Remote -Service -Ebene (WCF -Dienste oder Webdienste) zu erstellen, die den Verbrauchern die Geschäftsschicht aussetzt (Verbraucher Bevorzugbares Senden- und Empfangen von DTOs).

  • Anwendungsschicht: Eine Ebene, die die Kommunikation mit Domänenschicht und die Koordinierung der Transaktionslogik und der technischen Dienste übernimmt. Wenn Sie DTOs verwenden

  • Domänenschicht: Enthält Entitäten und Wertobjekte. Dies ist der Kern der Geschäftslogik, die in Bezug auf objektorientierte Domänenobjekte entwickelt wurde, die Daten und Logik verkapsend sind. Es könnte auch Repository -Schnittstellen enthalten, wenn das Repository -Muster verwendet wird. und Domänendienste für Logik, die nicht in eine einzige Entität passen.

  • Datenzugriff: Verwenden von ORM wie NHiNRNATE oder EF oder allen Datenzugriffstechniken, um Entitäten in Datenbanktabellen zuzuordnen.

  • Infrastruktur / gemeinsam

Ich werde versuchen, ein winziges Beispiel für jede Schicht zu geben: ein hypothetisches unvollständiges Beispiel sagen, dass Sie eine Bestellung aktivieren möchten

Präsentationsschicht (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 (Webdienst):

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

Anwendungsschicht:

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

Domänenschicht:

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 (Datenzugriffsschicht):

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
  }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top