Информация об изменениях

Сообщение Re[2]: Дизайн разделения бизнес-слоя (логического) на два ур от 23.05.2024 13:08

Изменено 23.05.2024 13:09 zelenprog

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

Спасибо! Идею понял.

R>

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

R>

Service1Facade на ПК-1

R>
R>public class Service1Facade {
R>    private Service1 service1;

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

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

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


Получается, что мы сформировали BusinessObject2 на втором физическом уровне-2, "упаковали" его в DTO, передали на уровень-1, и "распаковали".
То есть на уровне-1 есть класс, реализующий функциональность BusinessObject2.
И далее на уровне-1 мы уже работаем с ним как с обычным локальным бизнес-объектом.
Получается, что в данном примере на уровень-2 вынесено только создание\инициализация объекта. Как я понял, в этом случае предполагается, что и на уровне-1 и на уровне-2 есть одинаковая реализация класса BusinessObject2.

А что делать, если функциональность BusinessObject2 поделена на два уровня? Или вообще вся его функциональность находится на уровне-2?
То есть обращаясь к какому-либо методу BusinessObject2 на уровне-1, фактически должна происходить переадресация на уровень-2.

public class Service1AnyController {
    private Service1Facade mService1Facade;

    public Service1AnyController(Service1Facade pService1Facade) {
        this.mService1Facade = pService1Facade;
    }

    public SomeMethod (int id) {
        //...
        lBusinessObject2 = this.mService1Facade.getBusinessObject2(id);
        lRes1 = lBusinessObject2.Operation1();
        lRes2 = lBusinessObject2.Operation2();
        lSum = lRes1 + lRes2;
        return lSum;
    }
}


В этом случае вызов каждого метода BusinessObject2 — это обращение на уровень-2.
Получается, BusinessObject2 должен сам "переадресовывать" вызовы на другой уровень?
Re[2]: Дизайн разделения бизнес-слоя (логического) на два ур
R>Для решения проблемы разделения слоя бизнес-логики на два физических уровня, необходимо использовать архитектурные подходы, которые позволяют скрыть детали низкоуровневой инфраструктуры и при этом обеспечивают необходимое взаимодействие между частями бизнес-логики. Вот примерная схема и дизайн решения такого взаимодействия ...

Спасибо! Идею понял.

R>
R>public class Service1Facade {
R>    private Service1 service1;

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

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

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


Получается, что мы сформировали BusinessObject2 на втором физическом уровне-2, "упаковали" его в DTO, передали на уровень-1, и "распаковали".
То есть на уровне-1 есть класс, реализующий функциональность BusinessObject2.
И далее на уровне-1 мы уже работаем с ним как с обычным локальным бизнес-объектом.
Получается, что в данном примере на уровень-2 вынесено только создание\инициализация объекта. Как я понял, в этом случае предполагается, что и на уровне-1 и на уровне-2 есть одинаковая реализация класса BusinessObject2.

А что делать, если функциональность BusinessObject2 поделена на два уровня? Или вообще вся его функциональность находится на уровне-2?
То есть обращаясь к какому-либо методу BusinessObject2 на уровне-1, фактически должна происходить переадресация на уровень-2.

public class Service1AnyController {
    private Service1Facade mService1Facade;

    public Service1AnyController(Service1Facade pService1Facade) {
        this.mService1Facade = pService1Facade;
    }

    public SomeMethod (int id) {
        //...
        lBusinessObject2 = this.mService1Facade.getBusinessObject2(id);
        lRes1 = lBusinessObject2.Operation1();
        lRes2 = lBusinessObject2.Operation2();
        lSum = lRes1 + lRes2;
        return lSum;
    }
}


В этом случае вызов каждого метода BusinessObject2 — это обращение на уровень-2.
Получается, BusinessObject2 должен сам "переадресовывать" вызовы на другой уровень?