Что не так с использованием инсталляции setter для Android ViewModel против внедрения и ввода ViewModel.Factory?

Я изо всех сил пытаюсь получить синглтон Кинжал, введенный в компонент Android (Service) и ViewModel.

См. Этот вопрос в качестве справки. Я не нашел хороший пример того, как просто вставить поле в Сервис и поле в ViewModel с тем же объектом. Если есть простое решение, которое я хотел бы увидеть.

Я нашел несколько вопросов, здесь и здесь , которые имеют ответы, которые идут по пути реализации ViewModel.Factory, а затем вводят зависимости в конструктор подкласса ViewModel, который имеет зависимости через метод create.

Мой вопрос. Существуют ли какие-либо серьезные проблемы с простое вложение объекта в Activity (и Сервис), а затем с помощью установщика для инъекции объекта в ViewModel после его восстановления? Например.

class MainActivity : AppCompatActivity() { @Inject lateinit var messageBus: MessageBus // "thing" I want in the ViewModel override fun onCreate(savedInstanceState: Bundle?) { AndroidInjection.inject(this) super.onCreate(savedInstanceState) // get the ViewModel val viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java) // inject the "thing" via a setter viewModel.messageBus = messageBus } } 

В представлении класса MainViewModel я мог проверить, установлено ли это значение уже и только установить его, если оно равно null.

 class MainViewModel: ViewModel() { var messageBus: MessageBus? = null set(value) { if (field == null) { field = value // do initialization stuff } } } 

Я вижу это как маленький взлом, но не вредный взлом. Мне нравится идея предоставить ViewModelFactory с помощью кинжала вместе со всеми зависимостями, необходимыми для его функционирования, а затем вставлять их в активность, чтобы вы могли передать ее в метод of(FragmentActivity activity, ViewModelProvider.Factory factory) . Это позволяет избежать изменчивости этого свойства.