2013-05-31 16 views
12

Ich lerne über die Zwiebel-Architektur. Ich habe eine Verwirrung über den Service-Layer, weil ich einige Leute sehen, sagen, dass die Kernschicht nur enthalten:Zwiebel-Architektur: Business Services Interfaces und Implementierung

  • Modelle
  • Repository-Schnittstellen
  • Services-Schnittstellen

Aber anderer Ausdruck bringt, dass Es sollte auch die Dienste-Schnittstellen implementieren. Also, welche Schicht sollte die Dienste-Schnittstellen implementieren?

dachte ich, dass die Infrastrukturschicht implementieren sollten:

  • Repository Schnittstellen
  • Services Interfaces

und injizieren sie auf UI-Ebene und Testschicht, wenn angefordert.

Vielen Dank! enthalten

+3

Laut Jeffrey Palermo: * "Die allgemeine Philosophie der Zwiebel Architektur Ihrer Business-Logik und das Modell in der Mitte (Core) der Anwendung zu halten und Ihre Abhängigkeiten schieben so weit nach außen wie möglich. Die Problemdomäne ist dann völlig unabhängig von der benötigten Infrastruktur (Testen, Datenbanken, Sicherheit, etc.) Das bedeutet beispielsweise, dass das Testen von Datenbankzugriffen ohne eine echte Datenbank gründlich durchgeführt werden kann."* –

+0

Das bedeutet, dass wenn eine Klasse WorkOrderService, die eine Service-Schnittstelle IWorkOrderService implementiert, ein Repository IOrderRepository benötigt, dann würde es eine Klasse OrderRepository benötigen, die diese Repository Schnittstelle implementiert und von der Klasse außerhalb (Infraestructure Layer), so der Dienst Klasse WorkOrderService kann es nicht verwenden Haben Sie das Problem sehen In der anderen Art und Weise.?, wenn Sie die Service-Schnittstelle IWorkOrderService außerhalb des Kerns implementieren, können Sie DI/IoC verwenden Repository IOrderRepository Instanzen für das Abrufen und den Job zu erledigen . Dort ist mein Consufion – reliasr

+2

Sie sollten das in Ihrer Frage einschließen. –

Antwort

20

sollte die Kernschicht:

  • Modelle/Entities/POCOs/Whatever_the_name ... es ist alles über Domain-Objekte
  • ALLE die Schnittstellen (einschließlich Repositories und Dienstleistungen)
  • Ihr Kern Business-Services Implementierung (*)

(*) Wenn es in Ihrem Unternehmen darum geht, Bestellungen zu bearbeiten, sollte die Implementierung Ihres IWorkOrderService in der Core-Schicht erfolgen. Wenn Ihr WorkOrderService zugreifen muss, sagen wir (was nicht Ihr Geschäft ist), dann wird es nur die in der Kernschicht definierte IShippingService manipulieren und die IShippingService Implementierung wird irgendwo in der Infrastrukturschicht sein.

Wenn Ihre WorkOrderService eine OrderRepository benötigt, wird dies genau so gemacht.

Hier ist ein Codebeispiel:

namespace MyBusiness.Core.Services 
{ 
    internal class WorkOrderService: IWorkOrderService 
    { 
    public WorkOrderService(IOrderRepository orderRepository, IShippingService shippingService) 
    { 
     _orderRepository = orderRepository; 
     _shippingService = shippingService; 
    } 

    ... 
    } 
} 

Dieses bis in die äußerste Schicht der Zwiebel Architektur sein wird - die Abhängigkeit Resolution Ebene - gebunden alle Schnittstellen mit dem richtigen Service-Implementierung zur Laufzeit.

For<IWorkOrderService>().Use<Core.Services.WorkOrderService>(); 
For<IShippingService>().Use<Infrastructure.Services.ShippingService>(); 
For<IOrderRepository>().Use<Infrastructure.Data.OrderRepository>();