DDD, работа с файлами
DDD, работа с файлами
У сущности есть файл. Я его хочу сохранять в сервисном слое (ибо больше негде. в контроллере еще можно), но для этого мне нужно инжектить стороннюю библиотеку Filesystem.
Это норм, что в сервисном слое участвуют такие инфраструктурные зависимости?
Или по канонам DDD выходит, что мне нужен доменный интерфейс FilesystemInterface, а в инфраструктуре его реализация?
Это норм, что в сервисном слое участвуют такие инфраструктурные зависимости?
Или по канонам DDD выходит, что мне нужен доменный интерфейс FilesystemInterface, а в инфраструктуре его реализация?
Re: DDD, работа с файлами
в доменом слое у тебя будет VO с путем до файла например (я предпочитаю файловое хранилище абстрагировать например через minio и в доменном слое соотстветственно держать что-то типа File(id, provider_type, provider_id, getUrl()). Сам файл загружаешь/сохраняешь в сервисном слое.
таблица file(id, provider_type, provider_id)
1 minio 15
2 fs 27
таблица file_minio(id, bucket, path)
15 images /cats/cat.jpg
таблица file_fs(id, path)
27 /var/www/upload/cat.jpg
таблица file(id, provider_type, provider_id)
1 minio 15
2 fs 27
таблица file_minio(id, bucket, path)
15 images /cats/cat.jpg
таблица file_fs(id, path)
27 /var/www/upload/cat.jpg
Re: DDD, работа с файлами
Ты буквально описал то, что уже сделано Конечно, minio я не использую, мне достаточно локального хранилища (пока что), но с возможностью смены адаптера. Благо есть готовые библиотеки ФС с кучей адаптеров.zelenin писал(а): ↑2018.02.09, 13:38 в доменом слое у тебя будет VO с путем до файла например (я предпочитаю файловое хранилище абстрагировать например через minio и в доменном слое соотстветственно держать что-то типа File(id, provider_type, provider_id, getUrl()). Сам файл загружаешь/сохраняешь в сервисном слое.
Вернемся к вопросу. Меня немного смущает то, что в сервисах участвует инфраструктура (сторонняя библиотека league/flysystem, например), но я склоняюсь к тому, что бы не выделять доменный интерфейс для работы с ФС (и потом писать под него адаптер, что бы использовать в сервисах), а напрямую использовать эту библиотеку в сервисах (application layer).
Наверное, это риторический вопрос, и в данной ситуации верным решением будет использовать либу напрямую, чем городить интерфейсы и адаптеры ради DDD. DDD ради DDD мне не надо.
Re: DDD, работа с файлами
инфраструктура - инфраструктура в общем смысле. Она обслуживает все слои.
проблему не понял.Bio man писал(а): ↑2018.02.09, 13:54но я склоняюсь к тому, что бы не выделять доменный интерфейс для работы с ФС (и потом писать под него адаптер, что бы использовать в сервисах), а напрямую использовать эту библиотеку в сервисах (application layer).
Наверное, это риторический вопрос, и в данной ситуации верным решением будет использовать либу напрямую, чем городить интерфейсы и адаптеры ради DDD. DDD ради DDD мне не надо.
Re: DDD, работа с файлами
Есть готовые либы с адаптерами. Не вижу смысла заниматься выделением интерфейсов, когда есть готовые сторонние решения/интерфейсы
Re: DDD, работа с файлами
Re: DDD, работа с файлами
Я вот гадаю, что делать с временным файлом (не факт, что он был загружен через форму, так что полагаться на GC нельзя)? Удалять его в сервисе или же возложить ответственность за подчистку тому коду, который создал файл (контроллеру, например)?
Re: DDD, работа с файлами
В сервисе удалять нельзя. Ибо у сервиса нет информации, будет ли файл использоваться где-то еще в приложении. Так что, оставляем эту заботу тому, кто передал файл в сервис.