【问题标题】:ASP.NET MVC3 Service Layer - multiple repositories per service?ASP.NET MVC3 服务层 - 每个服务有多个存储库?
【发布时间】:2011-06-10 18:25:57
【问题描述】:

假设我的数据库中的订单状态和订单之间存在一对多关系。我创建新订单的视图需要有一个订单状态下拉列表。

我有用于订单和订单状态的单独存储库以及用于操作订单和订单状态的单独服务。类似的东西:

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 中包含对两个存储库的引用,并包含一个将返回 orderstatuse 的方法。

public class OrderService : IOrderService
{
    private readonly IRepository<Order> _OrderRepository; 
    private readonly IRepository<OrderStatus> _OrderStatusRepository;  ...

2) 让控制器知道这两个服务并使用 GetOrderStatus 方法获取 OrderStatus 列表:

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

【问题讨论】:

    标签: c# design-patterns asp.net-mvc-3


    【解决方案1】:

    就个人而言,我会选择您的选项 #1 - 将您的两个现有服务合二为一。请记住,您的服务层应该充当facade,而不是像您的存储库这样的较低级别的服务。为这种情况提供两个单独的服务会破坏目的。

    【讨论】:

      【解决方案2】:

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

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

      通过这样做,基本上您将规范化的数据从最适合操作的地方(数据库)转移到应用环境中,其中最好的范式是以对象/域为中心的方法,而不是规范化的方法。

      简单地说,您的服务应该根据域来设计,而不是根据您的数据库表来设计,所以我将只有具有方法“AddOrder”、“UpdateOrder”、“DeleteOrder”的唯一订单“服务” 、“搜索订单”等...

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

      希望这会有所帮助!

      【讨论】:

      • 根据发布的问题,我们不知道什么数据构成 OrderStatus - 也许有几个方面的数据构成了他的模型中 OrderStatus 的概念。
      • 我完全同意...我只是以 orderstatus 为例来说明一对多的关系。如果 orderstatuses 只包含一个字符串字段,我就不会有单独的服务或类。
      • @elkdanger: true,但理性的开发者会假设名称“status”表示它是的属性,即由全资拥有的东西,因此是枚举的绝佳候选者。它仍然没有改变我回答的基本主旨。
      猜你喜欢
      • 2011-05-21
      • 2020-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-05
      • 1970-01-01
      相关资源
      最近更新 更多