Dav*_*vid 4 c# design-patterns business-logic-layer data-access-layer
我对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();
}
Run Code Online (Sandbox Code Playgroud)
或者它应该更像下面这样?
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);
}
Run Code Online (Sandbox Code Playgroud)
使用此选项,BLL将处理所有内容,包括数据访问.将注入存储库以避免紧密耦合.然后,任何实体检索将采用_orderService.GetOrder(orderId);相似的形式直接进入存储库.
请原谅示例的粗糙,因为我没有太多时间.我写的任何东西都是有意义的,还是我在荒野中?
绝对不是第一个将业务逻辑嵌入控制器的选项.问题不在于控制器本身访问数据对象,而是必须遵循业务规则规定的过程.此过程在控制器中没有位置.
所以你应该选择第二个选项,或者可以选择Cancel一个方法Order.如果您已经编写了类似的代码,那么请保持一致性.