首页 文章

单例数据库对象启动时参数化初始化?

提问于
浏览
0

我正在尝试创建一个可供多个类使用的单个数据库实例(在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)

}

基本上,我通过对数据库容器使用延迟初始化来封装单个对象中的"database container",并提供lateinit vars来指定数据库名称并在singleton对象中具有初始化函数来初始化数据库容器 . 这是在我第一次启动应用程序时的主要方法中,我可以从一些本地属性文件加载数据库名称并调用 val database = DatabaseSingleton.init("DATABASE_NAME", client) 来创建需要多个其他类访问的数据库单例 .

这是一个做我想做的好方法,还是有更好的做事方式?

1 回答

  • 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
        }
    }
    

相关问题