2009-04-09 44 views
4

可能是一个非常普遍的问题,但找不到合适的答案了..传播应用程序设置

我有一个(Python的W/C++模块)的应用,使大量使用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框架中隐约看到了类似的东西,但我对这些东西没有任何经验。我的例子非常具体,但我想它也扩展到其他应用程序设置,因此文章的标题。

我想听听你的想法,最好的安排方式是什么。

+0

只是要清楚,foo.options是否将db_path定义为单例? – 2011-03-01 20:14:57

回答

2

是的,还有其他的。你的选项3虽然是Pythonic。

使用标准的Python模块封装选项(这就像Django的方式web框架做)

使用工厂发出正确配置会话。

由于SQLite已经有一个“连接”,为什么不使用它呢?你的DatabaseSession类增加了内置连接的缺点吗?

+0

感谢您的评论。我使用术语“数据库会话”来简化示例;在现实中,它更像是一个从数据库中获取蓝图的对象工厂。 – 2009-04-09 20:45:35