查询组合容器的好理由是什么(除了调试和愚弄)。在实际应用场景中,为什么我要使用GetExports或GetExportedValues?除了不需要额外的课程之外,使用导入或导入的好处是什么?
答案 0 :(得分:4)
我知道有三个原因:
不可抗力
某些第三方代码(您无法控制)通过反射按名称实例化您的类。那些类将必须在构造函数中自己处理它们的组合。
逐步重构
假设您已经拥有一个庞大的现有代码库,在没有DI的情况下编写。您希望逐步重构它以使用依赖注入。
假设您选择一个随机类并将其更改为使用依赖注入:现在您通常会看到您还必须更改实例化该类而不是接收注入依赖项的任何类。如果你纠正了这一点,你还需要更改实例化那些类等的类。
为了避免在一次重构中必须立即更改整个代码库的级联,临时插入额外的组合根通常很方便。
没有DI的快乐
您已经拥有一个没有控制反转的代码库,您只是想添加一个或多个扩展点。或者您可能已经在使用服务定位器模式而不是依赖注入。
答案 1 :(得分:-1)
通常,例如,当您需要动态加载一个导出时。例如,动态地取决于某些输入。
有很多情况下,导入 - 硬编码到接收类中 - 不起作用。
一个例子是终生。使用GetExport / GetExportedValue,我可以请求数据库存储库并在对象生存期之外对其进行处理。这对于可能需要或可能不需要存储库的元素非常方便,如果他们需要一个需要摆脱它而不需要删除整个类;)
然后是我经常使用的服务类型的场景。我的服务器应用程序具有非初始化的服务直到开始 - 这显然意味着导入无法工作,这会在创建服务时创建整个对象结构,而不是服务启动;)有充分的理由 - 例如配置可能detemrine在特定的机器上启动哪些服务,并且我的一些服务有点内存(在启动时拉一千兆字节或两个或十个缓存数据),所以当它没有启动时...它甚至不存在