2011-06-10 24 views
5

Digamos que tengo una relación de uno a muchos en mi base de datos entre orderstatus y pedidos. Mi punto de vista para crear un nuevo pedido debería tener un menú desplegable de orderstatuses.Capa de servicio de ASP.NET MVC3: ¿múltiples repositorios por servicio?

Tengo repositorios separados para el orden y el estado de la orden, así como servicios separados para manipular pedidos y estados de pedidos. Algo así como:

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(){...} 
} 

Mi corrector de orden tiene una referencia a la OrderService, un poco como esto:

public class OrderController : Controller 
{ 
private readonly IOrderService orderService; 

¿Cuál es la mejor manera de hacerlo obtener una lista de orderstatuses desde el PP?

1) Incluye una referencia a ambos repositorios en el OrderService e incluye un método que devolverá orderstatuses.

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

2) Hacer que el controlador sepa de ambos servicios y utilizar el método GetOrderStatus para obtener la lista de OrderStatuses:

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

3) Usar la OrderStatusService del OrderService para obtener la lista de orden Statuses , algo así como:

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

4) Otra manera fresca que no puedo pensar en :)

Respuesta

12

Personalmente, me gustaría ir con su opción n. ° 1: combine sus dos servicios existentes en uno solo. Recuerde que su capa de servicio se supone que actúa como un facade en servicios de nivel inferior como sus repositorios. Tener dos servicios separados para este tipo de derrotas es el propósito.

-1

Lo siento, pero no puedo por qué el estado de una orden necesita una clase en absoluto. ¿Por qué el estado del pedido no es una enumeración o algo así?

En cualquier caso, no caiga en la trampa de tratar de diseñar una forma de proyectar su base de datos en una capa de servicio expuesta para que todas las entidades y relaciones estén expuestas sin agregación o lógica de valor agregado.

Al hacer esto, básicamente mueve datos normalizados desde donde se manipula mejor (la base de datos) a un entorno de aplicación donde el mejor paradigma es un enfoque centrado en objeto/dominio, no un enfoque normalizado.

En pocas palabras, su servicio debe diseñarse en términos del dominio, no en términos de las tablas de su base de datos, por lo que solo tendría el único "servicio" que tuviera los métodos "AddOrder", "UpdateOrder", "DeleteOrder "," SearchOrders ", etc ...

Para obtener una lista de orden, statuss 'tiene otro servicio, tal vez llamado MetadataService, que devuelve un DTO que contiene todas las enumeraciones o elementos enum para su aplicación.

Espero que esto ayude!

+0

Según la pregunta publicada, no sabemos qué datos constituyen un Estado del pedido: quizás haya varias facetas de datos que conforman el concepto de un Estado del pedido dentro de su modelo. –

+0

Estoy completamente de acuerdo ... Solo estaba usando orderstatus como ejemplo para ilustrar la relación de uno a muchos. No tendría un servicio o clase por separado para orderstatuses si solo contenía un campo de cadena. – woggles

+0

@elkdanger: cierto, pero el desarrollador razonable supondría que el nombre " estado" indica que es una propiedad del , es decir, que pertenece totalmente al y, por lo tanto, es un excelente candidato para una enumeración. Todavía no altera ese empuje básico de mi respuesta. – Xhalent

Cuestiones relacionadas