Ну, после нескольких часов размышлений об этом, я думаю, что нашел решение, которое удовлетворит мои потребности. Цели, которые я хочу достичь:
- Веб-интерфейс не может выполнять прямые вызовы в базу данных; необходимо использовать правильную модель, которая в свою очередь будет использовать репозиторий некоторых объектов
- Должна быть возможность протестировать и развернуть все как один пакет с минимальной конфигурацией (по крайней мере, на этапе разработки, а затем должна быть возможность простого переключения на более гибкое решение)
- Не должно быть дублирования кода (т. Е. Один и тот же код в сервисе и модели веб-интерфейса)
- Если один из подходов окажется неправильным, мне нужно переключиться на другой
То, что я забыл сказать ранее, - это то, что в моей службе будет встроенный кэш, используемый для агрегирования и обработки данных, а затем для фиксации в базе данных с большими кусками. Это также присутствует на диаграмме.
Моя структура классов будет выглядеть так:
|
|- models
|- IElementsRepository.scala
|- ElementsRepositoryJSON.scala
|- ElementsRepositoryDB.scala
|- Element.scala
|- Service
|- Element.scala
|- Web
|- Element.scala
|- controlers
|- Element.scala
|- views
|- Element
|- index.scala.html
Так что это похоже на обычное веб-приложение MVC, за исключением того факта, что существуют отдельные классы моделей для сервиса и веб-интерфейса, унаследованные от основного.
В Element.scala у меня будет объект IElementsRepository, внедренный с использованием DI (возможно, с использованием Guice).
IElementsRepository имеет две конкретные реализации:
- ElementsRepositoryJSON позволяет получать данные из службы через JSON
- ElementsRepositoryDB позволяет извлекать данные из локального кэша и БД.
Это означает, что в зависимости от активной конфигурации DI сервис и веб-интерфейс могут получать данные из другого сервиса или локального / внешнего хранилища.
Так что для раннего развития я могу держать все в одной игре! создайте экземпляр и используйте прямой доступ к кешу и базе данных (через ElementsRepositoryDB), а затем перенастройте веб-интерфейс для использования JSON (через ElementsRepositoryJSON). Это также позволяет мне запускать графический интерфейс и сервис как отдельные экземпляры, если я хочу. Я даже могу настроить службу для использования других служб в качестве поставщиков данных (однако пока у меня нет таких потребностей).
Более или менее это будет выглядеть так: