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>();
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."* –
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
Powinieneś uwzględnić to w swoim pytaniu. –