瓶用依赖注射。

Bottle-Inject的Python项目详细描述


瓶依赖性注射

bottle框架已经在某些方面进行了依赖注入:路由的url参数作为关键字参数注入到处理程序函数中。其他一些插件(实际上,大多数插件)也这样做:它们注入数据库连接、身份验证上下文、会话对象等等。这个插件使这个概念对您可用,而无需为您要注入的每个依赖项编写一个新插件。如果你允许的话,它还可以改变你使用瓶子的方式,并以一种功能性的方式编写应用程序。如果做得好,依赖注入可以降低复杂性,并大大提高应用程序的可测试性和可读性。但是让我们从一个简单的例子开始:

app = Bottle()
injector = app.install(bottle.ext.inject.Plugin())

@injector.provider('db')
def get_db_handle():
    return my_database_connection.cursor()

@app.route('/random_quote')
def random_quote(db):
    row = db.execute('SELECT quote FROM quotes ORDER BY RANDOM() LIMIT 1').fetchone()
    return row['quote']

前两行并不新鲜。我们只需创建一个瓶子应用程序并安装这个插件。下一个街区更有趣。与瓶子将处理程序函数绑定到url路径的方式类似,注入器将提供程序绑定到注入点。在本例中,我们将提供程序"get_db_handle"绑定到名为"db"的注入点。当通过我们的注入器调用一个函数并有一个同名的参数时,它将从我们的提供程序接收一个新的数据库游标。你可以在接下来的几行中看到。因为所有处理程序回调都是由我们的Injector插件管理的,所以您只需要接受一个'db'参数,它就会由插件自动为我们注入。如果定义的路由不接受"db"参数,则不会发生任何事情。从未为该路线创建过数据库光标。

这个小例子很好地展示了依赖注入的好处:

  • 可以通过向"random_quote()"函数传递一个伪数据库或测试数据库对象来直接对其进行单元测试。无需为测试而设置整个应用程序。
  • 没有使用全局变量或全局状态。此函数可以在不同的上下文中再次使用,无需麻烦。
  • 您不必将 get_db_handle 导入定义瓶子应用程序路径的每个模块。
  • 您可以更改"get-db-handle"的实现,它会影响应用程序的每个路由。无需搜索/替换代码库。
  • 少打字。在重要的地方要懒惰。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何使用JNA创建同一库的多个实例?   java在将Graphql查询作为JSON字符串传递时收到意外的令牌错误   OAuth2 oltu的java问题   java桌面应用程序使用的好的嵌入式数据库是什么?   java Firebase数据库高级查询选项   java正在使磁盘上的EhCache元素过期   java 安卓还原处于backstack中的片段的实例状态   XMemcached中的java异步集   java TimescaleDB是否使用与Postgresql完全相同的JDBC驱动程序?   java从网站c读取信息#   检查java Android中的字符串是否只包含数字和空格   c#如何向web服务发送特殊字符?   grails无法调用需要java的方法。lang.类参数?   java我在组合框中调用的方法不会运行所有代码,它只运行部分代码   java发送带有标头的HTTP GET请求