Разделение BLL, PL и DAL в веб-приложении - PullRequest
0 голосов
/ 19 октября 2011

Мне дали задание разработать веб-приложение, которое может иметь несколько уровней представления, в настоящее время оно находится в Интернете, но скоро будет на настольных компьютерах и других платформах.Поэтому я искал, как это сделать лучше всего.Я обнаружил, что лучше использовать многоуровневый подход.

Я думаю иметь BLL в качестве веб-сервиса, к которому могут обращаться разные PL.BLL будет осуществлять доступ к DAL для операций с данными.Пока все хорошо, но я думал об использовании ASP.NET MVC для веб-приложения.Теперь я немного запутался, потому что «контроллеры» по сути содержат бизнес-логику, верно.Это хороший вариант?Если я иду по тому же пути, используя MVC и вышеупомянутые слои, мои контроллеры не обязательно будут содержать BLL, но будут только своего рода пустышками.

Это правильный способ сделать это?

1 Ответ

3 голосов
/ 19 октября 2011

Это рекомендуемые уровни:

  • Представление (MVC, WPF, что угодно): содержит только логику представления (никогда не включает в себя бизнес-логику), контроллер обрабатывает только связь с уровнем приложений / службдля координации связи.

  • Распределенные службы (удаленный фасад): поскольку у вас будет много клиентов, некоторые из них будут приложениями Windows, а другие - веб-приложениями, рекомендуется создатьуровень удаленного обслуживания (службы WCF или веб-службы), который предоставляет бизнес-уровень потребителям (предпочтительно DTO для отправки и получения).

  • прикладной уровень: уровень, который обрабатывает связь с уровнем домена,и координировать логику транзакций и технические сервисы, и если вы используете DTO, он переводит доменные объекты в DTO и наоборот

  • Уровень домена: содержит сущности и объекты значений, это ядробизнес-логики, разработанной в терминах объектно-ориентированных доменных объектов, инкапсулирующих данныеа логика.он также может содержать интерфейсы репозитория при использовании шаблона репозитория.и доменные службы для логики, которая не вписывается в один объект.

  • Доступ к данным: использование ORM, например NHibernate или EF, или любые другие методы доступа к данным для сопоставления объектов в таблицах базы данных.

  • Инфраструктура / Общее: код инфраструктуры и сквозные технические услуги, такие как ведение журнала

Я попытаюсь привести крошечный пример о каждом слое: гипотетический неполный примерскажем, вы хотите активировать заказ на покупку

Уровень представления (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);
  }
}

Уровень распределенного обслуживания (веб-служба):

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

Уровень приложения:

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

Уровень домена:

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

     .....
  }
}

Хранилища (уровень доступа к данным):

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

Инфраструктура:

public class Logger : ILogger
{
  public void Exception(Exception ex)
  {
   // write exception to whatever
  }
}
...