动态单例初始化(取决于参数)
Dynamic Singleton initialization (depending on parameter)
我是这样使用 dart 单例的:
class MyHandler {
static final MyHandler _singleton = MyHandler._internal();
Database database;
factory MyHandler({bool initDb}) {
return _singleton;
}
MyHandler._internal() {
initialize();
}
void initialize() async {
// initializing database here
}
}
现在我的问题是,当在 _internal()
中首次创建时调用 initialize
时,数据库被实例化。在我的测试中,我无法访问此数据库,因此我只想在 运行 我的应用程序正常时执行 initialize()
方法,但在进行测试时不执行。
这就是为什么我试图在创建单例时传递一个 (bool) 参数来决定是否应该调用 initialize()
的原因。这可能吗?我没有找到办法做到这一点。还有其他解决方案吗?谢谢!
可以吗?是的,但我不建议按照您的建议进行。这里有一个实现供参考。
// emphasis - this is not great design
class Handler {
static final Handler _singleton = Handler._internal();
static bool _initialized = false;
factory Handler({bool initDb = true}){
if(initDb && !_initialized){
Handler._singleton._initializeDb();
Handler._initialized = true;
}
return _singleton;
}
Handler._internal();
void _initializeDb(){
// ...
}
}
如果先使用 initDb = false 请求 Handler,然后再使用 initDb = true 会发生什么情况?或者反之亦然?这些可能会导致后续出现混乱和不透明的问题。
有多种替代方法可以解决此问题,但利用依赖注入是一种很好的方法。实现 DI 后,您可以提供一个模拟数据库对象。另一个可能正在连接到测试数据库而不是生产数据库。
我是这样使用 dart 单例的:
class MyHandler {
static final MyHandler _singleton = MyHandler._internal();
Database database;
factory MyHandler({bool initDb}) {
return _singleton;
}
MyHandler._internal() {
initialize();
}
void initialize() async {
// initializing database here
}
}
现在我的问题是,当在 _internal()
中首次创建时调用 initialize
时,数据库被实例化。在我的测试中,我无法访问此数据库,因此我只想在 运行 我的应用程序正常时执行 initialize()
方法,但在进行测试时不执行。
这就是为什么我试图在创建单例时传递一个 (bool) 参数来决定是否应该调用 initialize()
的原因。这可能吗?我没有找到办法做到这一点。还有其他解决方案吗?谢谢!
可以吗?是的,但我不建议按照您的建议进行。这里有一个实现供参考。
// emphasis - this is not great design
class Handler {
static final Handler _singleton = Handler._internal();
static bool _initialized = false;
factory Handler({bool initDb = true}){
if(initDb && !_initialized){
Handler._singleton._initializeDb();
Handler._initialized = true;
}
return _singleton;
}
Handler._internal();
void _initializeDb(){
// ...
}
}
如果先使用 initDb = false 请求 Handler,然后再使用 initDb = true 会发生什么情况?或者反之亦然?这些可能会导致后续出现混乱和不透明的问题。
有多种替代方法可以解决此问题,但利用依赖注入是一种很好的方法。实现 DI 后,您可以提供一个模拟数据库对象。另一个可能正在连接到测试数据库而不是生产数据库。