gpt4 book ai didi

scala - 如何在不进行硬编码的情况下使用 Cake 模式进行依赖注入(inject)?

转载 作者:行者123 更新时间:2023-12-03 05:22:04 27 4
gpt4 key购买 nike

我刚刚阅读并喜欢 the Cake pattern article 。然而,在我看来,使用依赖项注入(inject)的关键原因之一是您可以改变 XML 文件或命令行参数所使用的组件。

蛋糕模式如何处理 DI 的这方面?我见过的例子都涉及静态混合特征。

最佳答案

由于特征混合在 Scala 中是静态完成的,因此如果您想改变混合到对象中的特征,请根据某些条件创建不同的对象。

让我们以一个规范的蛋糕图案为例。您的模块被定义为特征,并且您的应用程序被构造为一个简单的对象,其中混合了一堆功能

val application =
new Object
extends Communications
with Parsing
with Persistence
with Logging
with ProductionDataSource
application.startup

现在,所有这些模块都有很好的自类型声明,定义了它们的模块间依赖关系,因此只有当所有模块间依赖关系存在、唯一且类型正确时,该行才会编译。特别是,Persistence 模块有一个 self 类型,它表示任何实现 Persistence 的东西都必须实现 DataSource,这是一个抽象模块特征。由于 ProductionDataSource 继承自 DataSource,所以一切都很好,并且该应用程序构建线可以编译。

但是,如果您想使用不同的数据源,指向某个本地数据库用于测试目的,该怎么办?进一步假设您不能仅使用从某些属性文件加载的不同配置参数来重用 ProductionDataSource。在这种情况下,您要做的就是定义一个扩展 DataSource 的新特征 TestDataSource,并将其混合进去。您甚至可以根据命令行标志动态地执行此操作。

val application = if (test)
new Object
extends Communications
with Parsing
with Persistence
with Logging
with TestDataSource
else
new Object
extends Communications
with Parsing
with Persistence
with Logging
with ProductionDataSource

application.startup

现在看起来比我们想要的更冗长,特别是如果您的应用程序需要在多个轴上改变其构造。从好的方面来说,您通常只有一 block 条件构造逻辑,就像应用程序中的那样(或者最坏的情况是每个可识别组件生命周期一次),因此至少可以最大程度地减少痛苦并与其余逻辑隔离开来。

关于scala - 如何在不进行硬编码的情况下使用 Cake 模式进行依赖注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5172188/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com