首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将播放剪影模块从Guice转换为Macwire时出错

将播放剪影模块从Guice转换为Macwire时出错
EN

Stack Overflow用户
提问于 2020-05-15 15:50:24
回答 1查看 66关注 0票数 0

我正在尝试将Guice转换为Macwire作为依赖注入框架。它是很好的,除了这个剪影模块,在那里我得到一个编译错误。底部有错误。

工作单元(Guice):

代码语言:javascript
复制
  class SilhouetteModule @Inject()(environment: play.api.Environment, configuration: 
   Configuration) extends AbstractModule with ScalaModule {

  override def configure() = {
      val iamConfig = IAMConfiguration
        .fromConfiguration(configuration)
        .fold(throw _, identity)

      val htPasswdFile = File.apply(configuration.get[String]("file"))

      bind[IdentityService[User]].toInstance(SimpleIdentityService.fromConfig(iamConfig))
      bind[Silhouette[BasicAuthEnv]].to[SilhouetteProvider[BasicAuthEnv]]
      bind[RequestProvider].to[BasicAuthProvider].asEagerSingleton()
      bind[PasswordHasherRegistry].toInstance(PasswordHasherRegistry(new BCryptPasswordHasher()))
      bind[AuthenticatorService[DummyAuthenticator]].toInstance(new DummyAuthenticatorService)
      bind[AuthInfoRepository].toInstance(HtpasswdAuthInfoRepository.fromFile(htPasswdFile))
      bind[SecuredErrorHandler].to[RestHttpSecuredErrorHandler]
  }

    @Provides
    def provideEnvironment(identityService: IdentityService[User], authenticatorService: 
       AuthenticatorService[DummyAuthenticator], eventBus: EventBus, requestProvider: 
       RequestProvider): Environment[BasicAuthEnv] =
        Environment[BasicAuthEnv](
          identityService, 
          authenticatorService, 
          Seq(requestProvider), 
          eventBus
       )
   }
}

在Macwire中的类似尝试:

代码语言:javascript
复制
trait SilhouetteModule extends BuiltInComponents {
   import com.softwaremill.macwire._

   val iamConfig = IAMConfiguration
     .fromConfiguration(configuration)
     .fold(throw _, identity)

   val htPasswdFile = File.apply(configuration.get[String]("file"))

   lazy val identityService: IdentityService[User] =
     SimpleIdentityService.fromConfig(iamConfig)

   lazy val basicAuthEnv: Silhouette[BasicAuthEnv] = wire[SilhouetteProvider[BasicAuthEnv]]

   lazy val requestProvider: RequestProvider = wire[BasicAuthProvider]

   lazy val passwordHasherRegistry: PasswordHasherRegistry = PasswordHasherRegistry(
      new BCryptPasswordHasher())
   lazy val authenticatorService: AuthenticatorService[DummyAuthenticator] =
      new DummyAuthenticatorService
   lazy val authInfoRepo: AuthInfoRepository =
      HtpasswdAuthInfoRepository.fromFile(htPasswdFile)

   lazy val errorHandler: SecuredErrorHandler = wire[RestHttpSecuredErrorHandler]

   lazy val env: Environment[BasicAuthEnv] = Environment[BasicAuthEnv](
     identityService,
     authenticatorService,
     Seq(requestProvider),
     eventBus
   )
   def eventBus: EventBus
 }

Macwire示例没有编译:我得到了一个错误:Cannot find a value of type: [com.mohiva.play.silhouette.api.actions.SecuredAction] lazy val basicAuthEnv: Silhouette[BasicAuthEnv] = wire[SilhouetteProvider[BasicAuthEnv]]

很抱歉,代码太多了,但我认为并行比较会更有帮助。任何帮助都会很好!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-15 16:42:27

MacWire不会神奇地创建值--如果它需要构造一个值,它会查看构造函数所使用的值;如果通过查看作用域中的所有可用值,它可以明确地找到构造函数的所有参数,则宏将创建代码new Class(resolvedArg1, resolvedArg2, ...)

所以

  • 所有这些值都必须在作用域内--它们可以由MacWire构造,也可以是由一些混合体实现的抽象成员,但如果有两个相同类型的值,则仍然必须显式地将它们写入
  • -- MacWire无法生成代码,因为它如何知道要选择哪个值?(如果其中一个值比另一个值“更接近”,但如果它们同样接近,则无法解析)

因此,如果您得到了错误:

代码语言:javascript
复制
Cannot find a value of type: [com.mohiva.play.silhouette.api.actions.SecuredAction]

这意味着您没有在com.mohiva.play.silhouette.api.actions.SecuredActionBuiltInComponents中声明任何类型的值。

如果这是由另一个特性提供的,您可以在这里添加抽象声明。

代码语言:javascript
复制
val securedAction: SecuredAction // abstract val

并在其他地方实现它(请注意避免循环依赖!)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61823322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档