c# – 业务逻辑层应该访问数据库/数据访问层吗?

我对BLL和DAL的关系有点困惑. BLL是否应通过依赖注入封装DAL?或者BLL是否只对域对象和DAL单独保存/更新?例如,想象(在典型的MVC应用程序中)取消订单功能,要求您更新订单并更新库存.以下是我的行动的样子吗?public...

我对BLL和DAL的关系有点困惑. BLL是否应通过依赖注入封装DAL?或者BLL是否只对域对象和DAL单独保存/更新?

例如,想象(在典型的MVC应用程序中)取消订单功能,要求您更新订单并更新库存.以下是我的行动的样子吗?

public ActionResult CancelOrder (Guid orderId) {
    Order order = orderRepository.Get(orderId);
    StockItem stockItem = stockRepository.Get(order.StockItemId);

    _orderService.CancelOrder(order, stockItem);
    orderRepository.Update(order);
    orderRepository.Update(stock);
    Return View();
}

或者它应该更像下面这样?

public ActionResult CancelOrder (Guid orderId) {
    _orderService.CancelOrder(orderId);
    Return View();
}

(within OrderService)
public void CancelOrder(Guid orderId) {
    Order order = orderRepository.Get(orderId);
    StockItem stockItem = stockRepository.Get(order.StockItemId);

    order.Cancelled = true;
    stockItem.AmountInStock = stockItem.AmountInStock + order.Amount;
    orderRepository.Update(order);
    orderRepository.Update(stock);
}

使用此选项,BLL将处理所有内容,包括数据访问.将注入存储库以避免紧密耦合.然后,任何实体检索都采用_orderService.GetOrder(orderId)的形式;因为决定直接进入存储库.

请原谅示例的粗糙,因为我没有太多时间.我写的任何东西都是有意义的,还是我在荒野中?

解决方法:

绝对不是第一个将业务逻辑嵌入控制器的选项.问题不在于控制器本身访问数据对象,而是必须遵循业务规则规定的过程.此过程在控制器中没有位置.

因此,您应该使用第二个选项,或者可能使取消订购方法.如果您已经编写了类似的代码,那么请保持一致性.

本文标题为:c# – 业务逻辑层应该访问数据库/数据访问层吗?

基础教程推荐