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) 另一种我想不出的很酷的方式:)

ASP.NET MVC3服务层-每个服务有多个存储库

就我个人而言,我会选择#1选项——将您的两个现有服务合并为一个。请记住,您的服务层应该充当较低级别服务(如存储库)的门面。为这类服务提供两个单独的服务是不符合目的的。

很抱歉,但我不明白为什么订单状态需要一个类。为什么订单状态不是枚举之类的?

在任何情况下,都不要陷入这样的陷阱:试图设计一种方法将数据库投影到公开的服务层中,以便在没有聚合或增值逻辑的情况下公开所有实体和关系。

通过这样做,基本上可以将规范化的数据从最适合操作的地方(数据库)移动到应用程序环境中,在该环境中,最佳范例是以对象/域为中心的方法,而不是规范化的方法。

简单地说,你的服务应该根据域来设计,而不是根据你的数据库表来设计,所以我只有唯一的订单"服务",它有方法"AddOrder"、"UpdateOrder"、"DeleteOrder"、"SearchOrders"等…

要获得订单状态列表,请使用另一个服务,可能称为MetadataService,该服务返回一个DTO,其中包含应用程序的所有枚举或类似枚举的内容。

希望这能有所帮助!