Re: Дизайн разделения бизнес-слоя (логического) на два уровня (физических)
От: r0nd  
Дата: 23.05.24 10:22
Оценка: 6 (1)
On May 23, 2024, 10:36 AM, zelenprog <140063@users.rsdn.org> wrote:

Z>Объясните, пожалуйста, как это делается?


Для решения проблемы разделения слоя бизнес-логики на два физических уровня, необходимо использовать архитектурные подходы, которые позволяют скрыть детали низкоуровневой инфраструктуры и при этом обеспечивают необходимое взаимодействие между частями бизнес-логики. Вот примерная схема и дизайн решения такого взаимодействия:

Основные концепции

  1. Сервисы: Используйте концепцию сервисов для разделения функциональности. Каждый сервис будет отвечать за определенную часть бизнес-логики и будет размещен на соответствующем сервере (физическом уровне).
  2. API и протоколы: Взаимодействие между сервисами будет происходить через хорошо определенные API. REST, gRPC или другие сетевые протоколы могут быть использованы для взаимодействия.
  3. Шаблон "Фасад": Используйте шаблон "Фасад" для скрытия деталей взаимодействия с инфраструктурой. Фасад будет предоставлять высокоуровневые методы для бизнес-логики и управлять сетевыми взаимодействиями за кулисами.

Примерная схема решения

Определение сервисов:
Фасады для взаимодействия:

Пример реализации

Service1Facade на ПК-1

public class Service1Facade {
    private Service1 service1;

    public Service1Facade(Service1 service1) {
        this.service1 = service1;
    }

    public BusinessObject2 getBusinessObject2(int id) {
        // Взаимодействие с Service2 через сеть
        String url = "http://service2.example.com/api/businessObject2/" + id;
        BusinessObject2DTO dto = RestClient.get(url, BusinessObject2DTO.class);
        return mapToBusinessObject2(dto);
    }

    private BusinessObject2 mapToBusinessObject2(BusinessObject2DTO dto) {
        // Маппинг DTO в бизнес-объект
        return new BusinessObject2(dto.getId(), dto.getName(), dto.getValue());
    }
}

Service2 на ПК-2

@RestController
@RequestMapping("/api/businessObject2")
public class Service2 {
    @GetMapping("/{id}")
    public BusinessObject2DTO getBusinessObject2(@PathVariable int id) {
        // Логика получения BusinessObject2
        BusinessObject2 obj = businessLogic.getBusinessObject2ById(id);
        return mapToDTO(obj);
    }

    private BusinessObject2DTO mapToDTO(BusinessObject2 obj) {
        // Маппинг бизнес-объекта в DTO
        return new BusinessObject2DTO(obj.getId(), obj.getName(), obj.getValue());
    }
}


Объяснение

  1. Фасад: Service1Facade предоставляет методы для взаимодействия с Service2. Он скрывает детали сетевых взаимодействий, предоставляя бизнес-логике высокоуровневые методы.
  2. API: Service2 на ПК-2 предоставляет REST API для доступа к своим бизнес-объектам. Это позволяет Service1 на ПК-1 запрашивать данные через HTTP.
  3. DTO: Использование Data Transfer Objects (DTO) для передачи данных между сервисами. Это обеспечивает слабую связанность и инкапсуляцию данных.

Преимущества

Таким образом, используя фасады, вы можете скрыть сетевые взаимодействия и детали инфраструктуры от бизнес-логики, обеспечивая чистую и масштабируемую архитектуру приложения.

❧ “Strength is keeping it together when everyone expects you to fall apart.” — Chris Bradford
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.