Это загадка электронной таблицы : пишете ли вы repository.store (entity) или entity.storeIn (repository)?
У каждого есть свои достоинства. Я обычно склоняюсь к repository.store (entity) по главной причине, по которой я сохраняю методы своих сущностей ориентированными на домен. Имеет смысл написать pen.dispenseInkOnto (Surface), потому что это то, что делают ручки. Немного меньше смысла писать pen.storeIn (penRepository).
Недостатком является то, что вам необходимо предоставить доступ к внутренним объектам класса сущности к классу постоянства. Помимо методов получения, которые представляют ту же проблему, что и entity.storeIn (), я бы пошел с классом друга, защищенным доступом к пакету, внутренним доступом или шаблоном класса друга , чтобы ограничить доступ только для тех, кому это нужно.
Что касается общего внедрения классов, то в примере pen.dispenseInkOnto (Surface) вы вполне можете сделать Surface интерфейсом и использовать внедрение. Я не вижу проблем с этим, пока вы внедряете другие объекты, объекты значения или службы.