簡體   English   中英

將 Play Silhouette 模塊從 Guice 轉換為 Macwire 時出錯

[英]Error converting Play Silhouette Module from Guice To Macwire

我正在嘗試將 Guice 轉換為 Macwire 作為依賴注入框架。 除了我遇到編譯錯誤的這個剪影模塊之外,一切都很好。 底部錯誤。

Guice 中的工作模塊:

  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 中的等效嘗試:

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]]

抱歉,它有很多代碼,但我認為並排比較會更有幫助。 任何幫助都會很棒!

MacWire 不會神奇地創建值 - 如果它需要構造一個值,它會查看構造函數采用的值,並且 - 如果通過查看 scope 中可用的所有值,它可以明確找到構造函數的所有參數,即宏創建代碼new Class(resolvedArg1, resolvedArg2, ...)

所以

  • 所有這些值都必須在 Scope 中 - 它們可以由 MacWire 構造,或者是由某些 mixin 實現的抽象成員,但您仍然必須明確寫下它們
  • 如果您在 scope 中有 2 個相同類型的值 - MacWire 無法生成代碼,因為它如何知道要選擇哪個值? (好吧,如果其中一個值比另一個值更接近“更接近”,但如果它們同樣接近,則無法解決)

因此,如果您收到錯誤消息:

Cannot find a value of type: [com.mohiva.play.silhouette.api.actions.SecuredAction]

這意味着您沒有在SilhouetteModulecom.mohiva.play.silhouette.api.actions.SecuredAction中聲明BuiltInComponents類型的任何值。

如果這是另一個特征提供的東西,您可以在此處添加抽象聲明

val securedAction: SecuredAction // abstract val

並在其他地方實現它(小心避免循環依賴。)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM