我需要在我的程序(H2、SQLite、NEO4J、Text 等)中存储/写入有关不同和多种数据支持的信息。我一一创建导出器,因此接口需要易于扩展。
我制作模拟程序,所以我需要在每一步存储信息(需要 db 对象,以及要存储的各种数据)。
我的第一个想法是使用具有通用方法的依赖注入模式,initializeWriter()
如下所示:stepWriter()
closeWriter()
trait OutputWriter { Simulation =>
def path:String
def initializeWriter()
def stepWriter()
def closeWriter()
}
需要实现 writer 的用户扩展了这个特性,并覆盖了方法。'database val' 通常包含由 initializeWriter 初始化后的 DB 对象。数据对象包含我想写的所有可能的数据。
我在 OutputWriter 和 Simulation 之间存在依赖关系,因为实际上我需要从模拟访问对象和函数来编写最终结果。我认为这不是一个非常好的解决方案,并且鉴于@x3ro 的答案,这是一个更好的解决方案,可以消除这些依赖关系,从而为作者提供一些更好的通用 DATA 对象。
我的问题是在这种情况下,如果我需要添加一些复杂的信息以将此 DATA 正确写入数据库,我可以将包含例如 sqlquery 或其他特定编写器命令的特定代码放在哪里?
所以,此时我的问题是:
1 - 我创建了一个 Data 对象,其中包含要在模拟的每个步骤中写入的数据。这个数据对象的结构是一样的,只是结果值移动了。
2 - 任何输出或多输出写入器,其中包含正确写入输出的所有方法:TextWriter、SQLITEWriter 等。
3 - 使 (1) -> (2) 之间的关系的代码的特定部分。将double的indexedSeq写入文本文件没有问题,但是写入SQL数据库,我需要给表的写入器结构,查询以插入数据等。
我的第一个想法是将此代码设置到 Writer 方法的 stepWriter() 中,但也许有更好的解决方案,因为我认为在这里我打破了 writer 的通用性
object DB
object MyData
trait DBWriter extends OutputWriter {
val database:DB = DB
def initializeWriter() = { ... }
def stepWriter(dataToWrite:MyData) = { ... }
}
之后,如果我需要导出我的模拟,我会添加这样的好作者:
new Simulation (...) with DBWriter {
override def path = "my-path-for-db"
initializeWriter()
// computation loop
(0 until 50){ var result:MyData= computeData() ; stepWriter(result) }
closeWriter()
}
还有其他模式(在文献中或根据您的经验)您经常使用更强大或更灵活的模式来做到这一点?
非常感谢您的经验回报,SR。