Кто должен создавать сервисы с модификатором пакета, если я реализую архитектуру из книги «Чистая архитектура»

Я прочитал книгу дяди Боба «Чистая архитектура». Есть одна глава, написанная Саймоном Брауном. Он пересмотрел несколько типов архитектуры. Он предлагает инкапсулировать реализации в пакеты.

введите описание изображения здесь

Если я верну пакеты и отмечу (с помощью графического затухания) те типы, для которых модификатор доступа можно сделать более ограничивающим, картина станет довольно интересной (рис. 34.8).

Я реализовал один подход с помощью Spring DI:

com.my.service

public interface OrderService {
    List<Order> getOrders();
}

и реализация:

com.my.service.impl

@Service
class OrderServiceImpl implements OrderService {
    //...
}

Он отлично работает, потому что Spring находит OrderServiceImpl помеченную @Service аннотацию. OrderServiceImpl инкапсулирован, как на (Рисунок 34.8.)

Но как я могу повторить это без конфигурации аннотации Spring? Например, если я использую конфигурацию Java Spring, я должен создать bean-компонент, подобный этому:

@Configuration
public class AppConfig {

    @Bean
    OrderService orderService(){
        return new OrderServiceImpl();
    }
}

Но у OrderServiceImpl есть модификатор пакета.

Если я не использую Spring, что мне делать, чтобы повторить этот подход?


person Pavel Petrashov    schedule 30.10.2020    source источник


Ответы (1)


Я бы разместил конфиги по разным типам упаковки.

Послойная упаковка

Я бы создал

  • WebConfig в пакете com.mycompany.myapp.web`, который создает компоненты для веб-уровня
  • ServiceConfig в com.mycompany.myapp.service пакете, который создает bean-компоненты для уровня сервиса
  • DataConfig в пакете com.mycompany.myapp.data, который создает компоненты для уровня данных

Пакет по функциям

Я бы создал

  • OrdersConfig в пакете com.mycompany.myapp.orders, который создает компоненты для функции заказов

Порты и адаптеры

Я бы создал

  • WebPortsConfig в com.mycompany.myapp.web пакете, который создает веб-компоненты.
  • OrderConfig в com.mycompany.myapp.domain пакете, который создает доменные объекты архитектуры портов и адаптеров.
  • DatabaseAdapersConfig в com.mycompany.myapp.database, который создает bean-компоненты адаптера базы данных.

Пакет по компонентам

Я бы создал

  • WebConfig в com.mycompany.myapp.web пакете, который создает все компоненты для веб-сайтов.
  • OrdersConfig в com.mycompany.myapp.orders пакете, который создает все компоненты для компонента заказа.

Подразделения развертывания

Событие, если конфигурации Spring находятся в одном пакете, они не должны находиться в одном модуле развертывания или модуле.

Например. вы можете создать service.jar и service-config.jar, чтобы отделить чистое приложение от фреймворка.

service.jar
+- com
   +- mycompany
      +- myapp
         +- service
            +- OrderService.class
            +- OrderServiceImpl.class


service-config.jar
+- com
   +- mycompany
      +- myapp
         +- service
            +- ServiceConfig.class

Затем вам просто нужно поместить оба jar-файла в путь к классам, и вы можете либо добавить com.mycompany.myapp.service к сканированию компонентов в основном классе, либо напрямую ссылаться на ServiceConfig.

person René Link    schedule 11.11.2020