通过java / kotlin中的inject()将变量传递给类构造函数

时间:2018-08-09 02:10:47

标签: java javafx dependency-injection kotlin tornadofx

我的主班是这样设置的:

class MyView : View() {    

    val controller: PollController by inject()
    etc
}

我想传递一个变量(例如路径文件的字符串)

class PollController : Controller() {

val currentData = SimpleStringProperty()
val stopped = SimpleBooleanProperty(true)

val scheduledService = object : ScheduledService<DataResult>() {
    init {
        period = Duration.seconds(1.0)
    }
    override fun createTask() : Task<DataResult> = FetchDataTask()
}

fun start() {
    scheduledService.restart()
    stopped.value = false
}

inner class FetchDataTask : Task<DataResult>() {

    override fun call() : DataResult {
        return DataResult(SimpleStringProperty(File(**path**).readText()))
    }

    override fun succeeded() {
        this@PollController.currentData.value = value.data.value // Here is the value of the test file
    }

}

}

[DataResult仅仅是SimpleStringProperty数据类]

,以便类PollController中的函数可以引用路径文件。我不知道注射的工作原理。 @Inject始终保持红色,添加构造函数会抛出Controller()对象返回

2 个答案:

答案 0 :(得分:1)

这是Scope的好用例。作用域将Controllers和ViewModels隔离开,以便您可以使用不同版本的资源使用不同的作用域。如果还添加一个ViewModel来保存上下文,则可以执行以下操作:

let assetWriter = try? AVAssetWriter(outputURL: outputURL, fileType: .mov)
FileManager.default.removeItemIfExist(at: outputURL)
// do something

现在将上下文对象添加到Controller中,以便您可以从控制器实例中的任何函数访问它。

class MyView : View() {
    val pc1: PollController by inject(Scope(PollContext("somePath")))
    val pc2: PollController by inject(Scope(PollContext("someOtherPath")))
}

上下文对象可以包含两个输入/输出变量。在此示例中,它以输入路径作为参数。请注意,框架无法实例化这种ViewModel,因此您必须像上面显示的那样手动将其中一个放入Scope。

class PollController : Controller() {
    val context : PollContext by inject()
}

答案 1 :(得分:1)

您可以执行以下操作:

主应用

class MyApp: App(MainView::class)

MainView

class MainView : View() {
    override val root = hbox {
        add(FileView("C:\\passedTestFile.txt"))
    }
}

FileView

class FileView(filePath: String = "C:\\test.txt") : View() {

    private val controller : FileController by inject(params = mapOf("pathFile" to filePath))

    override val root = hbox {
        label(controller.pathFile)
    }
}

FileController

class FileController: Controller() {
    val pathFile : String by param()
}

控制器使用by param()通过参数来访问路径,视图期望通过构造函数参数来使用此变量,并在注入控制器时使用它(inject委托具有可选的params论点)。使用此视图(在MainView中时,唯一剩下的就是在实例创建时传递文件路径。

最后得到:

enter image description here

无论如何,我将创建3层而不是2层,即经典的model-view-controller(或任何派生)层,并将文件路径存储在模型中。