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

时间:2011-06-10 09:59:11

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

说我在orderstatus和orders之间的数据库中有一对多的关系。我创建新订单的观点需要有一个ordertatuses下拉列表。

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

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;

从db获取orderstatuses列表的最佳方法是什么?

1)在OrderService中包含对两个存储库的引用,并包含一个将返回orderstatuses的方法。

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

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

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

2 个答案:

答案 0 :(得分:12)

就个人而言,我会选择您的选项#1 - 将您现有的两项服务合二为一。请记住,您的服务层应该充当facade而不是像您的存储库那样的低级服务。为此类提供两种不同的服务会使目的失败。

答案 1 :(得分:-1)

对不起,但我不知道为什么订单状态需要一个班级。为什么订单状态不是枚举或其他类似的?

无论如何,不​​要陷入尝试设计将数据库投影到公开服务层的方法的陷阱,以便暴露所有实体和关系而不使用聚合或增值逻辑。

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

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

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

希望这有帮助!