как внедрить свойство через guice, не эксплицируя его в блок init - PullRequest
0 голосов
/ 16 мая 2019

Я пытаюсь придерживаться шестиугольной архитектуры, и у меня есть следующие модели:

  • QuestionStepContent
  • SingleSelectorStepContent

оба простираются от WorkflowStepContent. У меня также есть сервис HtmlToMarkupConverter, определенный как интерфейс на уровне модели, реализованный классом на уровне инфраструктуры. В качестве инжектора я использую guice, но экземпляры моделей напрямую генерируют new, передавая значениеObjects. Я ищу хороший и аккуратный способ ввести сервис. Код, приведенный ниже, работает, но блок init - это не то, что мне нравится. Есть ли альтернативный способ внедрить службу, не используя блок init и не используя guice программно в моих моделях? То есть путем введения свойств для классов, которые создаются явно, с помощью аннотации.

sealed class WorkflowStepContent constructor (
    open val id: String,
    val htmlContent: String? = null
) {
    var converter: HtmlToMarkupConverter
    val markupContent: String?

    init {
        var injector = Guice.createInjector(DiagnosticsModule())
        converter = injector.getInstance(HtmlToMarkupConverter::class.java)
        markupContent = converter(htmlContent)
    }
}

data class QuestionStepContent(
    override val id: String,
    val title: String,
    val options: List<Option>
) : WorkflowStepContent(id)

data class SingleSelectorStepContent(
    override val id: String,
    val title: String,
    val options: List<Option>,
    val signalName: String,
    val valueKey: String
) : WorkflowStepContent(id)
...