动态单例初始化(取决于参数)

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 后,您可以提供一个模拟数据库对象。另一个可能正在连接到测试数据库而不是生产数据库。