Мне интересно, как лучше всего разделить ответственность в следующем примере.
Существует объект Foo
, который имеет несколько полей id
и несколько полей reallySecretImportantData
. Id — это простой идентификатор для ссылки на объект, а reallySecretImportantData
— это данные, которые должны быть зашифрованы в базе данных, так как база данных — единственное уязвимое место в данном примере.
Теперь, если у нас есть FooService
с методами void storeFoo(Foo foo)
и Foo readFoo(Id id)
.
У нас также есть FooRepository
со стандартными методами CRUD, которые хранят объекты Foo в базе данных.
Теперь, поскольку я хочу сохранить reallySecretImportantData
в зашифрованном виде, мне нужно где-то зашифровать и где-то расшифровать.
Поскольку в обязанности FooRepository
s не должны входить криптооперации, логичным местом будет FooService
.
Теперь, если бы я был в какой-то среде разработки, я бы хотел, чтобы для целей разработки и тестирования сохранить reallySecretImportantData
в виде простого текста.
При условии, что я использую какой-то DI, я мог бы написать 2 реализации моей службы, одну для prod и другую для dev/test, и просто настроить DI для использования prod в производственной среде и dev/test в среде dev&test.
Теперь, если в ближайшем будущем возникнет запрос на изменение способа хранения reallySecretImportantData
, я мог бы просто написать другую реализацию сервиса и использовать свой DI-фреймворк для его внедрения.
Будет ли этот простой дизайн достаточно хорош для текущего макета?