可能是一个非常常见的问题,但还没有找到合适的答案..
我有一个(带有 C++ 模块的 Python)应用程序,它大量使用 SQLite 数据库,并且它的路径由用户在应用程序启动时提供。
每次应用程序的某些部分需要访问数据库时,我计划获取一个新会话并在完成后将其丢弃。为此,我显然需要访问启动时提供的路径。我看到它发生的几种方式:
1. 明确的论点
数据库路径通过显式参数传递到它需要的任何地方,并且数据库会话使用该显式路径进行实例化。这可能是最模块化的,但似乎非常尴尬。
2. 数据库路径单例
数据库会话对象如下所示:
import foo.options
class DatabaseSession(object):
def __init__(self, path=foo.options.db_path):
...
我认为这是一个不那么邪恶的单例,因为我们只存储常量字符串,在应用程序运行时不会改变。这样就可以在DatabaseSession
必要时覆盖默认值并对该类进行单元测试。
3.数据库路径单例+静态工厂方法
也许比上述略有改进:
def make_session(path=None):
import foo.options
if path is None:
path = foo.options.db_path
return DatabaseSession(path)
class DatabaseSession(object):
def __init__(self, path):
...
这种方式模块根本不依赖foo.options
,除非我们使用工厂方法。此外,该方法可以执行诸如会话缓存之类的东西。
还有其他模式,我不知道。我在 web 框架中隐约看到类似的东西,但我对这些没有任何经验。我的示例非常具体,但我想它也会扩展到其他应用程序设置,因此是帖子的标题。
我想听听你的想法,什么是最好的安排方式。