我正在研究使用Falcon作为框架的SQL Alchemy支持的REST服务,并尝试尽可能干净地将服务层与数据库层分开,并希望在将来的某个时候将其扩展到成千上万个用户和请求。
我的背景主要是Java,所以我已经使用DAO模式完成了很多次工作-DAO模式是一个数据访问对象,它包装对数据库的调用(即,创建,查询,更新,删除)并隐藏实现细节,例如SQL语句,事务,会话,提交等。我正在尝试找出是否有人在Python中执行此操作,并且您会使用与Java中相同的面向对象,依赖项注入方法,还是会使用其他方法。
选项A:
我的经验是在应用程序启动时创建DAO,并将其“注入”到需要它们的REST服务层中。因此,在猎鹰的“资源”中:
class FooResource():
def on_post(self, req, resp):
foo_form = json.loads(req.stream.read().decode("utf-8"))
dao: FooDAO = self.daos[FooDAO.__name__]
dao.create_foo(foo_form)
在这里, self.daos 会在应用程序启动时填充,类似于您引导弹簧容器的方式。 DAO将使用SQL Alchemy会话注册表对象实例化,并且该会话将在DAO方法中动态创建。 FooDAO看起来像这样:
class FooDAO():
def __init__(self, session_registry: scoped_session):
self.session_registry = session_registry
def create_foo(self, foo_form):
session = self.session_registry()
foo = FooModel(foo_form)
session.add(foo)
选项B:
依赖注入方法对于不熟悉这些概念的Python团队来说是很难的。另一个选择是对DAO层使用静态调用:
def on_post(self, req, resp):
foo_form = json.loads(req.stream.read().decode("utf-8"))
session = req.context["session"] # this is created in a Falcon middleware
FooDAO.create_foo(foo_form, session)
在这种情况下,FooDAO不会保持任何状态:
class FooDAO():
@staticmethod
def create_foo(self, foo_form, session):
foo = FooModel(foo_form)
session.add(foo)
我对静态的经验是强烈反对使用它们,并在类之间建立了紧密的联系。但是,我没有在Python社区看到这个问题-也许是因为类没有得到广泛使用?
选项C:
第三个选择是简化并在没有类的情况下执行此操作。我并不反对这种想法,但是采用这种方法,我们将失去对象继承和封装的某些好处。