如何将依赖项注入 Kotlin 中的接口委托?
How do I inject a dependency into an interface delegate in Kotlin?
我正在尝试弄清楚如何将依赖项注入 Kotlin 中的接口委托。我有一个 class:
class MyThingie {}
我想向此 class 添加一个字段 created_time
,该字段也可能会添加到其他 class。所以我可以创建一个接口和这个接口的实例实现,然后将该委托添加到 class 定义中:
interface ThingieWithCreatedTS {
val created_ts: Long
}
object ThingieCreatedAtNow : ThingieWithCreatedTS {
override val created_ts: Long = System.currentTimeMillis()
}
class MyThingie : ThingieWithCreatedTS by ThingieCreatedAtNow {}
太棒了。现在我可以在 MyThingie
的任何实例上调用 created_ts
并获取它创建的时间戳。但是,现在很难测试。
我真的不想尝试模拟 System
,我知道正确的模式是将某种 Clock 实例注入任何需要知道当前时间的对象中。这样,我可以在代码中提供一个 RealClock,在测试中我可以提供一个 FakeClock(我可以控制输出)。
我不清楚如何在此模式上执行此操作。如何将实现实例传递给委托?
为什么不直接使用构造函数依赖注入?
class MyThingie(
dep: ThingieWithCreatedTS = ThingieCreatedAtNow
) : ThingieWithCreatedTS by dep {}
现在您可以在测试中提供虚假的 ThingieWithCreatedTS
依赖关系
我正在尝试弄清楚如何将依赖项注入 Kotlin 中的接口委托。我有一个 class:
class MyThingie {}
我想向此 class 添加一个字段 created_time
,该字段也可能会添加到其他 class。所以我可以创建一个接口和这个接口的实例实现,然后将该委托添加到 class 定义中:
interface ThingieWithCreatedTS {
val created_ts: Long
}
object ThingieCreatedAtNow : ThingieWithCreatedTS {
override val created_ts: Long = System.currentTimeMillis()
}
class MyThingie : ThingieWithCreatedTS by ThingieCreatedAtNow {}
太棒了。现在我可以在 MyThingie
的任何实例上调用 created_ts
并获取它创建的时间戳。但是,现在很难测试。
我真的不想尝试模拟 System
,我知道正确的模式是将某种 Clock 实例注入任何需要知道当前时间的对象中。这样,我可以在代码中提供一个 RealClock,在测试中我可以提供一个 FakeClock(我可以控制输出)。
我不清楚如何在此模式上执行此操作。如何将实现实例传递给委托?
为什么不直接使用构造函数依赖注入?
class MyThingie(
dep: ThingieWithCreatedTS = ThingieCreatedAtNow
) : ThingieWithCreatedTS by dep {}
现在您可以在测试中提供虚假的 ThingieWithCreatedTS
依赖关系