瓶用依赖注射。

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第三方库


热门话题
如何在JavaEE中隔离用户会话?   java什么是CacheManager的替代方法。集合名(字符串名)   当am通过==运算符比较对象时,java sop命令未打印附加文本为什么?   java如何关闭一个gui的一个窗口,该窗口有两个打开的窗口,而不同时关闭这两个窗口?   java如何在socket回调中使用观察器?   java在自定义soap处理程序中是否有一种获得操作名的保证方法?   正则表达式Java解析字符串   java希望从其他方法检索RGB像素值,但无法检索   java如何在Android RecyclerView中循环浏览项目?   java tomcat 8上的主机中的软件中止了已建立的连接   java Apache CXF3。具有可靠消息传递的0.4 Soap web服务引发异常   Java与Hibernate数据库   使用put存储新的键值对时,现有键的java Hashmap值将被覆盖。如何预防?   并非所有unix shell的java命令都在运行   java根据元素的自然顺序对列表进行排序   基于值的java同步方法评估   java如何使用axis2 java2wsdl创建标头?   铸造如何阻止java舍入   java计数休眠和命名查询