Re[3]: Дизайн разделения бизнес-слоя (логического) на два ур
От: r0nd  
Дата: 23.05.24 13:50
Оценка: 4 (1)
On May 23, 2024, 4:08 PM, zelenprog <140063@users.rsdn.org> wrote:

Z>Получается, BusinessObject2 должен сам "переадресовывать" вызовы на другой уровень?



В случае, когда функциональность BusinessObject2 распределена между двумя уровнями или полностью находится на втором уровне, вы можете использовать подход, основанный на шаблоне "Прокси". Этот подход позволяет объекту на уровне-1 переадресовывать вызовы методов на уровень-2.

Прокси для BusinessObject2 на уровне-1

  1. Интерфейс BusinessObject2: Определите интерфейс, который будет описывать методы бизнес-объекта.
  2. Прокси для BusinessObject2: Реализуйте прокси-класс, который будет выполнять сетевые запросы для вызова методов на уровне-2.

Интерфейс BusinessObject2

public interface BusinessObject2 {
    int operation1();
    int operation2();
    // Другие методы
}


Прокси-класс на уровне-1

public class BusinessObject2Proxy implements BusinessObject2 {
    private int id;
    private RestClient restClient; // Предположим, что это ваш HTTP клиент

    public BusinessObject2Proxy(int id, RestClient restClient) {
        this.id = id;
        this.restClient = restClient;
    }

    @Override
    public int operation1() {
        String url = "http://service2.example.com/api/businessObject2/" + id + "/operation1";
        return restClient.get(url, Integer.class);
    }

    @Override
    public int operation2() {
        String url = "http://service2.example.com/api/businessObject2/" + id + "/operation2";
        return restClient.get(url, Integer.class);
    }

    // Другие методы
}


REST API на уровне-2

@RestController
@RequestMapping("/api/businessObject2")
public class Service2 {

    @GetMapping("/{id}/operation1")
    public int operation1(@PathVariable int id) {
        // Логика выполнения operation1
        BusinessObject2 obj = businessLogic.getBusinessObject2ById(id);
        return obj.operation1();
    }

    @GetMapping("/{id}/operation2")
    public int operation2(@PathVariable int id) {
        // Логика выполнения operation2
        BusinessObject2 obj = businessLogic.getBusinessObject2ById(id);
        return obj.operation2();
    }

    // Другие методы
}

Использование прокси в контроллере на уровне-1

public class Service1AnyController {
    private Service1Facade mService1Facade;
    private RestClient restClient; // Предположим, что это ваш HTTP клиент

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

    public int someMethod(int id) {
        // Создаем прокси-объект для BusinessObject2
        BusinessObject2 lBusinessObject2 = new BusinessObject2Proxy(id, restClient);

        // Вызовы методов, которые фактически будут переадресованы на уровень-2
        int lRes1 = lBusinessObject2.operation1();
        int lRes2 = lBusinessObject2.operation2();
        int lSum = lRes1 + lRes2;
        return lSum;
    }
}


  1. Интерфейс: Интерфейс BusinessObject2 определяет методы, которые должен реализовывать бизнес-объект.
  2. Прокси: Прокси-класс BusinessObject2Proxy реализует интерфейс и содержит логику для переадресации вызовов методов на уровень-2 через сетевые запросы.
  3. REST API: На уровне-2 реализуются соответствующие конечные точки API для обработки запросов и выполнения логики.
  4. Контроллер: Контроллер на уровне-1 использует прокси-объект для взаимодействия с бизнес-логикой на уровне-2. Вызовы методов прокси-объекта фактически переадресуются на уровень-2.


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

❧ “Do not wait for the perfect time and place to enter, for you are already onstage.”
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.