4

查询组合容器的充分理由是什么(除了调试和鬼混)。在实际应用场景中,为什么要使用 GetExports 或 GetExportedValues?除了不需要额外的类之外,使用 import 或 importmany 有什么好处?

4

2 回答 2

4

我知道的原因有以下三个:

  1. 不可抗力

    一些 3rdparty 代码(您无法控制)通过反射按名称实例化您的类。然后,这些类将不得不在构造函数中自己处理它们的组合。

  2. 逐步重构

    假设您已经有一个庞大的现有代码库,在编写时没有考虑 DI。您希望逐步重构它以使用依赖注入。

    假设您选择一个随机类并将其更改为使用依赖注入:现在您通常会看到您还必须更改任何实例化该类的类,而不是接收注入的依赖项。如果您更正了这一点,您还需要更改实例化这些类等的类。

    为了避免在一次重构中必须立即更改整个代码库的级联,临时插入额外的组合根通常很方便。

  3. 没有DI的快乐

    您已经拥有一个没有控制反转的代码库并且您很满意,您只想添加一个或多个扩展点。或者您可能已经在使用服务定位器模式而不是依赖注入。

于 2012-06-08T14:38:04.653 回答
-1

通常,例如,当您只需要动态加载 ONE 导出时。例如,动态地取决于某些输入。

在很多情况下,导入(硬编码到接收类中)不起作用。

一个例子是生命周期。使用 GetExport / GetExportedValue,我可以请求数据库存储库并将其置于对象生命周期之外。这对于可能需要也可能不需要存储库的元素非常有用,如果他们需要在不摆脱整个类的情况下摆脱它;)

然后是我经常使用的服务类型的场景。我的服务器应用程序具有在启动前未初始化的服务 - 这很明显意味着导入无法工作,这会在服务创建时创建整个对象结构,而不是服务启动;)这有充分的理由 - 例如配置可能会确定在特定机器上启动哪些服务,并且我的一些服务的内存很重(在启动时提取一个千兆字节或两个或十个缓存数据),所以当它没有启动时......它甚至不存在更好.

于 2012-06-08T03:54:21.240 回答