问题标签 [macwire]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
54 浏览

playframework - 无法使用带有 Macwire 的 DI 为子项目导入 Play Routes

我正在使用已编译的 DI 和子项目开发 Play 2.6 项目:与常规 Play 项目的一个区别是我在 app 下创建了一个包,因此控制器位于 com.company.my.controllers.InfoController。这是结构:

当我运行项目时,出现以下错误:

在这个文件中:

我如何告诉 Play 考虑这些路线?另外,如果每个子项目都可以是一个独立的应用程序,我应该连接 App1ApplicationLoader 类吗?

什么是名称wire[app1Routes]或wire[App1Routes]

0 投票
0 回答
105 浏览

scala - MacWire:是否可以像 @Inject 和 Guice 那样自动连接递归相关的案例类?

以下代码在编译时失败:

是否有可能让 macwire 自动推断它可以通过创建一个B来创建一个A(老实说,lazy val a = wire[A]甚至不需要)?如果macwire做不到,是否有另一个 Scala 框架可以以类型安全的方式做到这一点(我知道 Dagger,但我正在寻找基于 scala 的解决方案)。

为了说明,在 Guice 中,我可以执行以下操作:

0 投票
1 回答
377 浏览

scala - 使用 macwire 注入 DatabaseConfigProvider

我试图将Slick添加到我的项目中

创建RoomRepo

注入它

使用macwire加载的ChatEngine

然后我得到这个错误:

[错误] /MyApplicationLoader.scala:31:59: 类型 get 不是对象 play.api.db.slick.DatabaseConfigProvider 的成员

[错误] 懒惰 val dbConfigProvider = 线[DatabaseConfigProvider.get[JdbcProfile]]

[错误] ^ [错误] /MyApplicationLoader.scala:32:25:找不到类型的值:[play.api.db.slick.DatabaseConfigProvider]

[错误] 懒惰 val dbRoom = 线 [RoomRepo]

[错误] ^ [错误] /MyApplicationLoader.scala:33:29:找不到类型的值:[models.RoomRepo]

[错误] 懒 val chatEngine = 线 [ChatEngine]

0 投票
1 回答
50 浏览

scala - 将 Play Silhouette 模块从 Guice 转换为 Macwire 时出错

我正在尝试从 Guice 转换为 Macwire 作为依赖注入框架。除了我遇到编译错误的这个剪影模块之外,一切都很好。底部错误。

Guice 中的工作模块:

Macwire 中的等效尝试:

Macwire 示例无法编译:我收到错误消息: Cannot find a value of type: [com.mohiva.play.silhouette.api.actions.SecuredAction] lazy val basicAuthEnv: Silhouette[BasicAuthEnv] = wire[SilhouetteProvider[BasicAuthEnv]]

抱歉,它有很多代码,但我认为并排比较会更有帮助。任何帮助都会很棒!

0 投票
1 回答
79 浏览

scala - 未满足 Macwire 依赖项

我在我的 scala 项目中使用电线。我有一个用例---

这会引发错误 -

找不到类型的值:[etl.infrastructure.endpoints.SchemaRegistryClient]

如果我在EndpointModule中创建硬编码的SchemaRegistryClient对象,它就可以工作。

谁能帮助解释如何解决这个问题以及这里发生了什么?

我似乎无法找到一种方法来满足依赖。

LightweightinstructionRunner在一个 diff 包中,而SchemaRegistrySchemaRegistryClient在同一个包中。

0 投票
0 回答
104 浏览

scala - Scala.js 生态系统是否提供任何方式来增加或替换 scala 类的属性字段的自动生成的 setter/mutator 方法?

请考虑一系列简单和案例类,交叉编译到 JVM 和 Scala.js,它们混合使用属性与自动和手动定义的访问器方法。许多来自外部库,但都继承自询问者拥有的特定特征

如何对继承自 ContextuallyMutable 的每个类的所有 setter/mutator 方法实施系统范围的约束?

有问题的约束将执行上下文分为两种类型:ownerclient。如果从所有者上下文调用,setter 会正常执行,但在客户端上下文中它会启动远程过程调用。

作为一个粗略的例子,考虑一个简单的案例类:

这会提示 Scala 编译器生成一个 setter/mutator 方法,例如:

为了满足约束,setter 方法应该改为:

在一个较小、协作较少的项目中,可以想象手动将约束强制写入每个类的每个 setter/mutator:

...但是人们不应该想象这样乏味、容易出错的样板文件,以免给贡献库的维护者带来类似的乏味。

此外,手动覆盖的访问器方法与已建立的序列化规范冲突,因为 Scala 常规使用下划线:private var _propName:Type用于手动定义的属性。

在不改变 Scala.js 类的源代码的情况下,如何将它的 setter/mutator 方法注入以调用上下文为条件的替代行为?

更广泛地说:Scala.js 生态系统是否提供任何方式来增加或替换 scala 类的属性字段的自动生成的 setter/mutator 方法?

编辑:进一步的研究发现了一些可能性和相关的子问题:

  • 依赖注入框架的拦截器。Scala.js 版本的MacWire拦截器能否满足此约束?文档并没有明确说明拦截器是否可以针对给定特征的所有继承者的所有 setter/mutator。如果 MacWire 或其他兼容 Scala.js 的 DI 框架可以提供此功能,那么 IOC 看起来是一个相对轻松的解决方案,除了将繁重的框架依赖项添加到库中的糟糕方式。
  • 包装纸。以下工作,除了它需要重构对 PropTest 的每个实例的每个引用,并强制该库的用户有意识地区分 Client 和 Owner 上下文。
  • 子类。扩展原始类型很好地解决了这个问题,只是它依赖于许多繁琐的样板,扩展了案例类,并且不编译。
  • 包装的子类或 DIY 代理。更有吸引力的是,通过将包装器与子类结合起来,我们最大限度地提高了包装器和被包装类之间的类型兼容性。但是,我们还结合了我们希望避免的所有惩罚:编译器错误、乏味和样板,并添加了扩展案例类的禁忌实践:

当然,这些编译器错误在将原来的case类改写为:

...但是,正如前面提到的:这种干预需要更多的打字,而不是从头开始完全重写整个项目。

另一种方法更直接地关注委托/代理实例的概念。代理类的主要挑战似乎源于一种类型合并问题。一个理想的代理与它所调解的类型没有用户可区分的区别。

  • Java 的Proxy类及其InvocationHandler。完美,只是它只代理 Java 接口并且依赖于 Scala.js 无法支持的反射。
  • Scala 的代理特性。仅限于 hashCode、equals 和 toString 方法并已弃用。
  • 由cmhteixeira委托宏编译器插件 。非常接近,但是,就像 Java 的 Proxy 类一样,它只适用于接口(也是 trait)并且只促进手动方法覆盖。也许与其他宏一起使用,这可能有助于一个漂亮的解决方案,但也许一个类和该类的代理之间的类型差距永远不会完全关闭。

在 Scala 生态系统中,委托/代理能否以完全类型安全的方式代替其目标?cmhteixeira会怎么说?

其他编译器插件解决方案:

  • Jakub Kozłowski的better-tostringpolyvariant指出了在编译时重写自动生成的 toString 方法的可能性,并且明确地不是手动覆盖的方法,但是由于对编译器插件的了解为零,询问者无法估计通过开发解决这个设计挑战的可行性一个自定义的 Scala 编译器插件。有什么想法吗,雅库布·科兹沃夫斯基

感谢您的考虑!