Python的依赖项注入和自定义Pickler

时间:2019-02-25 21:01:30

标签: python dependency-injection pickle

我正在尝试序列化具有外部依赖性的类。

创建类的方式是,它在其init函数中接收一个配置,并创建一个接收该配置并将其分配给self的对象。

我要完成的工作是,我要序列化该类,并根据创建的上下文,希望能够注入一个不同的配置。

class Foo:
  def __init__(self, some_value, config):
    self.some_value = some_value
    self.some_service = SomeService(config)

在这种情况下,我想要的是对self.some_value进行序列化,而不要对self.some_service进行序列化(并且在更改后也不能配置)。

那么,正确的模式是什么?我看过getstate / setstate dunder,它非常适合仅序列化该类的一部分,但在取消拾取时不注入config。我本来希望Unpickler在这种情况下可以完美地工作,但是看起来却不是这样(由于某种原因,它似乎只能与文件一起使用?数据在redis DB中被序列化,因此没有文件)。我宁愿也没有服务定位器,但注入配置而不是获取配置。

说明: 问题不在于如何使用泡菜或泡菜。问题更多是模式的选择。我在对象中有外部依赖关系(由self.some_service = SomeService(config)表示)。

有两种方法可以在解开时重建该对象:

  • 使用自定义的Pickler / Unpickler来检测外部依赖项实例,序列化其哈希值,并在取消选择时将当时需要的任何实例提供给它
  • 创建get / setstate dunder函数来检测服务,而不对它进行序列化。

两者都有优点和缺点,但是我想知道推荐哪一个。取消拾取时,取消拾取器可以具有外部依赖关系,并且在取消拾取时,可以将其重新分配给对象,但这似乎是一个“繁重的”解决方案。使用get / setstate dunder要求让类知道如何获取外部依赖项,并且看起来有点“神奇”(该类感染外部服务,而不是将它们提供给该类)。

1 个答案:

答案 0 :(得分:0)

我最终得到的解决方案本质上有点像服务定位器:我实例化实例,然后调用自定义for

相关问题