2013-05-31 16 views
12

Poznaję architekturę cebuli. Mam wątpliwości dotyczące warstwy usługowej, bo widzę kilka osób mówiących, że warstwa bazowa powinna zawierać wyłącznie:Architektura cebuli: Interfejsy i implementacja usług biznesowych

  • modele
  • Repozytorium interfejsów
  • Usługi interfejsy

Ale inni wyrazić, że powinien także implementować interfejsy usług. Jaka warstwa powinna implementować interfejsy usług?

Myślałem, że warstwa infrastruktury powinien realizować:

  • Repozytorium Interfejsy
  • Usługi Interfejsy

i wstrzyknąć je do warstwy UI i warstwy testów na żądanie.

Dziękujemy!

+3

Według Jeffrey Palermo: * "Ogólna filozofia cebuli Architektury jest, aby zachować swoją logikę biznesową i model w środku (Core) swojej aplikacji i push zależności jak daleko na zewnątrz, jak to możliwe. Domena problemowa jest wtedy całkowicie niezależna od wymaganej infrastruktury (testowanie, bazy danych, bezpieczeństwo itp.). Oznacza to na przykład, że dostęp do baz danych testowych można wykonać dokładnie bez rzeczywistej bazy danych."* –

+0

Oznacza to, że jeśli klasa WorkOrderService, która implementuje interfejs usługi IWorkOrderService, potrzebuje repozytorium IOrderRepository, wówczas potrzebowałaby klasy OrderRepository, która implementuje interfejs repozytorium , a także zgodnie z projektem, że ta klasa znajduje się na zewnątrz (warstwa Infraestructure), , więc usługa klasa WorkOrderService nie może go użyć. Czy widzisz problem? Innymi słowy: jeśli implementujesz interfejs usługi IWorkOrderService poza jądrem, możesz użyć DI/IoC do pobrania instancji IOrderRepository repozytorium i wykonania zadania. Jest mój cons. – reliasr

+2

Powinieneś uwzględnić to w swoim pytaniu. –

Odpowiedz

20

Warstwa bazowa powinna zawierać:

  • modele/Jednostki/Poços/Whatever_the_name ... to wszystko o domenie obiektów
  • WSZELKIE interfejsy (w tym repozytoriów i usługi)
  • podstawowej wdrożenie usług biznesowych (*)

(*) Jeśli Twoja firma zajmuje się obsługą zamówień, implementacja Twojego IWorkOrderService powinna znajdować się w warstwie rdzenia. Jeśli Twój WorkOrderService musi uzyskać dostęp, powiedzmy, ShippingService (który nie jest Twoją firmą), wówczas będzie on manipulował jedynie IShippingService zdefiniowanym w warstwie rdzenia, a implementacja IShippingService będzie znajdować się gdzieś w warstwie infrastruktury.

Jeśli twoje WorkOrderService potrzebuje OrderRepository, zostanie to zrobione w ten sam sposób.

Oto przykładowy kod:

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

    ... 
    } 
} 

To będzie aż do najbardziej zewnętrznej warstwy cebuli swojej architekturze - warstwy Zależność Rozdzielczość - do wszystkich interfejsów związanych z prawej realizacji usług w czasie wykonywania.

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