C# - Service-Layer-Design-Muster

Suchen wir in erstellen ein neues Projekt und wollen zu erkunden mit dem Repository und Service-layer-Muster, das Ziel ist das erstellen von lose gekoppelten code vollständig getestet mit mock-repositories.

Unten finden Sie die grundlegende Architektur Idee. Wir werden über Schnittstellen zu beschreiben, die repositories und injizieren diese in den service-Layer zu entfernen Sie alle Abhängigkeiten. Dann mit autofac wir Draht, die services zur Laufzeit.

public interface IOrderRepository
{
    IQueryable<Order> GetAll();
}

public class OrderRepository : IOrderRepository
{
    public IQueryable<Order> GetAll()
    {
        return new List<Order>().AsQueryable();
    }
}

public class OrderService
{
    private readonly IOrderRepository _orderRepository;

    public OrderService(IOrderRepository orderRepository)
    {
        _orderRepository = orderRepository;
    }

    public IQueryable<Order> GetAll()
    {
        return _orderRepository.GetAll();
    }
}

public class EmailService
{
    public void SendEmails()
    {
        //How do I call the GetAll method from the order serivce
        //I need to inject into the orderService the repository to use
    }
}

Gibt es ein paar Fragen, die wir Schwierigkeiten haben, herauszufinden, der beste Weg nach vorn.

1) Sollte der service sein, die Reproduktion der CRUD-Methoden, wie es scheint, können wir reproduzieren code ohne wirklichen nutzen. Oder sollte die Benutzeroberfläche rufen Sie die repositories direkt?

2) Was passiert, wenn ein Dienst braucht, um einen anderen Dienst. In unserem Beispiel oben, wenn die E-Mail-Dienst braucht, um all die Aufträge, die wir injizieren die um-service in der E-Mail-service?

Hoffe, das macht Sinn

E-Mail-service sollte nicht bewusst sein, Dienste wie OrderService, müssen Sie die Vermittler arbeiten mit beiden E-Mail&&Dienstleistungen, so würden Sie entkoppelt
Was macht Ihr, um Dienst zu tun? Nur Kapseln die OrderRepository? Oder muss er mehr tun, als die, aus der sieht der code es scheint nur, wie eine redundante layer.
Ich würde eine andere Frage stellen. Ist es gut, zu entlarven IQueryable<T> außerhalb der repository-Grenze ? Für mich nicht. Es ist ein leaky abstraction.
IQueryable<T> ist völlig mockable?
ja, aber das ist nicht der Punkt

InformationsquelleAutor user1223218 | 2012-02-21

Schreibe einen Kommentar