我试图创建一个可供多个类使用的单个数据库实例(在Kotlin中使用object
关键字)。但是,我希望能够在创建单例实例之前指定数据库名称。
由于无法使用参数初始化单个对象,我想知道我所做的事情是否有效,或者是否有更好的做事方式:
object DatabaseSingleton {
private lateinit var databaseName: String
private lateinit var mongoClient: MongoClient
val database: DatabaseContainer by lazy {
DatabaseContainer(databaseName, mongoClient)
}
fun init(databaseName: String, mongoClient: MongoClient): DatabaseSingleton {
this.databaseName = databaseName
this.mongoClient = mongoClient
return this
}
}
在另一个档案中
class DatabaseContainer(databaseName: String, val mongoClient: MongoClient) {
val db: MongoDatabase = mongoClient.getDatabase(databaseName)
val table: MongoCollection<Settings> = db.getCollection<Settings>(TABLE_NAME)
}
基本上,我正在封装一个&#34;数据库容器&#34;在单例对象中,通过对数据库容器使用延迟初始化并提供lateinit vars来指定数据库名称并在singleton对象中具有初始化函数来初始化数据库容器。这是在我第一次启动应用程序时的主要方法中,我可以从一些本地属性文件加载数据库名称并调用val database = DatabaseSingleton.init("DATABASE_NAME", client)
来创建我的数据库单例,需要多个其他类访问。 / p>
这是一种做我想做的好方法,还是有更好的做事方法?
答案 0 :(得分:2)
尝试从系统属性(或系统环境变量)获取databaseName。您可以在起始脚本中设置属性。
例如:java -DdatabaseName=databaseA ....
object DatabaseSingleton {
private const var DB_NAME_SYS_KEY = "databaseName"
private lateinit var databaseName: String
private lateinit var mongoClient: MongoClient
val database: DatabaseContainer by lazy {
DatabaseContainer(databaseName, mongoClient)
}
fun init(mongoClient: MongoClient): DatabaseSingleton {
this.databaseName = System.getProperty(DB_NAME_SYS_KEY)
this.mongoClient = mongoClient
return this
}
}