Skip to content

配置 DI 插件

所需依赖项io.ktor:ktor-server-di

代码示例 server-di

您可以在应用程序配置文件中配置 依赖项注入 (DI) 插件。这些设置会全局影响依赖项解析的行为,并适用于所有已注册的依赖项。

依赖项键映射

ktor.di.keyMapping 属性定义了在解析过程中如何对依赖项键进行泛化和匹配。这决定了在解析请求类型时,哪些已注册的依赖项被视为兼容。

yaml
ktor:
  di:
    keyMapping: Supertypes * Nullables * OutTypeArgumentsSupertypes * RawTypes

上述示例匹配了 DI 插件使用的默认键映射。

可用的键映射选项

Default
<code>Default</code> 使用默认组合:
Supertypes
<code>Supertypes</code> 允许使用其任何超类型解析依赖项。
Nullables
<code>Nullables</code> 允许匹配类型的可空和不可空变体。
OutTypeArgumentsSupertypes
<code>OutTypeArgumentsSupertypes</code> 允许 out 类型参数的协变。
RawTypes
<code>RawTypes</code> 允许在不考虑类型实参的情况下解析泛型类型。
Unnamed
<code>Unnamed</code> 匹配时忽略依赖项名称 (@Named)。

组合键映射选项

您可以使用集合运算符 *(交集)、+(并集)和 ()(圆括号分组)来组合键映射选项。

在以下示例中,注册为 List<String> 的依赖项可以被解析为 Collection<String>Supertypes)、ListList?RawTypesNullables):

yaml
ktor:
  di:
    keyMapping: Supertypes + (Nullables * RawTypes)

它不会被解析为 Collection?,因为该组合未包含在表达式中。

冲突解决策略

ktor.di.conflictPolicy 属性控制当为同一个依赖项键注册了多个提供程序时,DI 容器的行为方式:

yaml
ktor:
  di:
    conflictPolicy: Default

可用策略

Default
<code>Default</code> 声明冲突的依赖项时抛出异常。
OverridePrevious
<code>OverridePrevious</code> 使用新提供的依赖项覆盖之前的依赖项。
IgnoreConflicts
<code>IgnoreConflicts</code> 在测试环境中,DI 插件默认使用 IgnoreConflicts。这允许测试代码覆盖生产依赖项而不会触发错误。