ASP.NET MVC3服务层-每个服务有多个存储库
本文关键字:服务 存储 NET MVC3 ASP | 更新日期: 2023-09-27 17:58:55
假设我的数据库中orderstatus和订单之间存在一对多关系。我创建新订单的视图需要有订单状态的下拉列表。
我有用于订单和订单状态的独立存储库,以及用于操作订单和订单状况的独立服务。类似于:
public class OrderService : IOrderService
{
private readonly IRepository<Order> _orderRepository;
public OrderService(IRepository<Order> orderRepository) {_orderRepository = orderRepository }
public IEnumerable<Orders> GetAllOrders(){...}
}
public class OrderStatusService : IOrderStatusService
{
private readonly IRepository<OrderStatus> _OrderStatusRepository;
public OrderStatusService(IRepository<OrderStatus> orderStatusRepository) {_orderStatusRepository = orderStatusRepository }
public IEnumerable<OrderStatus> GetAllOrderStatuses(){...}
}
我的订单控制器引用了OrderService,有点像这样:
public class OrderController : Controller
{
private readonly IOrderService orderService;
从数据库中获取订单状态列表的最佳方法是什么?
1) 在OrderService中包含对这两个存储库的引用,并包含将返回订单状态的方法。
public class OrderService : IOrderService
{
private readonly IRepository<Order> _OrderRepository;
private readonly IRepository<OrderStatus> _OrderStatusRepository; ...
2) 让控制器知道这两个服务,并使用GetOrderStatus方法获得OrderStatues:的列表
public class OrderController : Controller
{
private readonly IOrderService orderService;
private readonly IOrderService orderStatusService; ...
3) 使用OrderService中的OrderStatusService获取订单状态列表,类似于:
public class OrderService : IOrderService
{
private readonly IRepository<Order> _orderRepository;
private readonly IOrderService _orderService; ...
public IEnumerable<OrderStatus> GetOrderStatuses()
{ return _orderService.GetOrderStatuses; } ...
4) 另一种我想不出的很酷的方式:)
就我个人而言,我会选择#1选项——将您的两个现有服务合并为一个。请记住,您的服务层应该充当较低级别服务(如存储库)的门面。为这类服务提供两个单独的服务是不符合目的的。
很抱歉,但我不明白为什么订单状态需要一个类。为什么订单状态不是枚举之类的?
在任何情况下,都不要陷入这样的陷阱:试图设计一种方法将数据库投影到公开的服务层中,以便在没有聚合或增值逻辑的情况下公开所有实体和关系。
通过这样做,基本上可以将规范化的数据从最适合操作的地方(数据库)移动到应用程序环境中,在该环境中,最佳范例是以对象/域为中心的方法,而不是规范化的方法。
简单地说,你的服务应该根据域来设计,而不是根据你的数据库表来设计,所以我只有唯一的订单"服务",它有方法"AddOrder"、"UpdateOrder"、"DeleteOrder"、"SearchOrders"等…
要获得订单状态列表,请使用另一个服务,可能称为MetadataService,该服务返回一个DTO,其中包含应用程序的所有枚举或类似枚举的内容。
希望这能有所帮助!