ASP.NET MVC3 Service Layer - несколько репозиториев на сервис? - PullRequest
5 голосов
/ 10 июня 2011

Скажем, в моей базе данных есть отношение один ко многим между статусами заказов и заказами. Мой взгляд на создание нового заказа должен иметь выпадающий список статусов заказов.

У меня есть отдельные репозитории для статуса заказа и заказа, а также отдельные сервисы для управления заказами и статусами заказа. Что-то вроде:

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, чтобы получить список OrderStatuses:

  public class OrderController : Controller
{
 private readonly IOrderService orderService;
 private readonly IOrderService orderStatusService; ...

3) Используйте OrderStatusService из OrderService, чтобы получить список статусов заказов, что-то вроде:

    public class OrderService : IOrderService
{
    private readonly IRepository<Order> _orderRepository; 
    private readonly IOrderService _orderService; ...
    public IEnumerable<OrderStatus> GetOrderStatuses()
    { return _orderService.GetOrderStatuses; } ...

4) Еще один крутой способ, о котором я не могу думать :)

Ответы [ 2 ]

12 голосов
/ 10 июня 2011

Лично я бы выбрал ваш вариант # 1 - объединить две ваши существующие услуги в одну.Помните, что ваш уровень сервиса должен действовать как фасад над сервисами более низкого уровня, такими как ваши репозитории.Наличие двух отдельных сервисов для такого рода поражений цели.

0 голосов
/ 10 июня 2011

Извините, но я не могу понять, почему статус заказа вообще нужен классу.Почему статус заказа не является перечислением или чем-то подобным?

В любом случае, не попадайтесь в ловушку, пытаясь придумать способ проецирования вашей базы данных на открытый уровень обслуживания, чтобы все сущности и отношениявыставлены без агрегации или логики добавления стоимости.

Делая это, в основном вы перемещаете нормализованные данные из того места, где их лучше всего манипулировать (база данных), в среду приложения, где лучшая парадигма - подход, ориентированный на объект / домен, а не нормализованный подход.

Проще говоря, ваша служба должна быть разработана с точки зрения домена, а не с точки зрения таблиц вашей базы данных, поэтому у меня будет только единственный заказ "служба", который имеет методы "AddOrder", "UpdateOrder", "DeleteOrder",«SearchOrders» и т. Д. *

Чтобы получить список статусов заказов, есть другая служба, возможно, называемая MetadataService, которая возвращает DTO, содержащий все перечисления или перечислимые элементы для вашего приложения.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...