From 17267493c6f5f5e7bf747244e57b07ea99b0ec3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Tue, 11 Mar 2025 21:47:40 +0200 Subject: [PATCH] docs: add service layer architecture diagram --- service-layer/README.md | 5 +++++ .../etc/service-layer-architecture-diagram.png | Bin 0 -> 31006 bytes 2 files changed, 5 insertions(+) create mode 100644 service-layer/etc/service-layer-architecture-diagram.png diff --git a/service-layer/README.md b/service-layer/README.md index 4e50542c7..1d737980e 100644 --- a/service-layer/README.md +++ b/service-layer/README.md @@ -36,6 +36,11 @@ Wikipedia says > Service layer is an architectural pattern, applied within the service-orientation design paradigm, which aims to organize the services, within a service inventory, into a set of logical layers. Services that are categorized into a particular layer share functionality. This helps to reduce the conceptual overhead related to managing the service inventory, as the services belonging to the same layer address a smaller set of activities. +Architecture diagram + +![Service Layer Architecture Diagram](./etc/service-layer-architecture-diagram.png) + + ## Programmatic Example of Service Layer Pattern in Java Our Java implementation uses the Service Layer pattern to streamline interactions between data access objects (DAOs) and the business logic, ensuring a clean separation of concerns. diff --git a/service-layer/etc/service-layer-architecture-diagram.png b/service-layer/etc/service-layer-architecture-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..f7e6438d0ad5df92438e7ac6bdc1f5b561f34fbf GIT binary patch literal 31006 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 literal 0 HcmV?d00001