如何将 ComponentController 传递给控制器

how to pass ComponentController to a controller

我有一个控制器。我想传递一个 DAO 组件 userRepo 给它

class UserController @Inject()(userRepo: Repository[User,Integer],cc: ControllerComponents)(implicit exec: ExecutionContext) extends AbstractController(cc){...}

我正在 hook 编译时 DI 如下:

class AppComponents(context: Context) extends BuiltInComponentsFromContext(context) with CassandraRepositoryComponents {

  lazy val applicationController = new controllers.UserController(userRepository)
  lazy val assets = new controllers.Assets(httpErrorHandler)

  override def router: Router = new Routes(
    httpErrorHandler,
    applicationController,
    assets
  )
}

问题 1 - 我的问题是我不知道要传递什么 ControllerComponent

问题 2 - lazy val assets = new controllers.Assets(httpErrorHandler)

出现以下错误 missing parameter meta:AssetsMetaData

问题 3 - 我想我也没有正确使用路由。我可以看到 IDE 显示潜在错误 cannot resolve constructor

  override def router: Router = new Routes(
    httpErrorHandler,
    applicationController,
    assets
  )

我正在学习以下教程,但由于它基于 Play 2.4,因此在 2.6 中可能不会 运行。我怎样才能让上面的代码在 Play 2.6 中工作?

http://manuel.kiessling.net/2016/01/17/compile-time-cassandra-injection-in-play-2-4/

1 的答案 - BuiltInComponentsFromContext 有一个 ControllerComponents

的实例

对 2 的回答 - 使用了 BuiltInComponentsFromContext 中定义的 assets

对 3 的回答 - 路由文件期望所有控制器都传递给它。就我而言。我没有通过所有控制器。

完整代码

class AppComponents (context: Context) extends BuiltInComponentsFromContext(context)
  with CassandraRepositoryComponents
  with HttpFiltersComponents
  with controllers.AssetsComponents
  with CSRFComponents{


  lazy val userRepositoryController = new controllers.UserController(userRepository, controllerComponents) //answer 1
  lazy val homeController = new controllers.HomeController(controllerComponents, csrfAddToken,csrfCheck) //answer 3. create all controllers and pass it to Routes below
  //AtomicCounter is application's class, not Play's class to it is instantiated explicitly in the loader.
  lazy val countController = new controllers.CountController(controllerComponents,new AtomicCounter())
  lazy val asyncController = new controllers.AsyncController(controllerComponents, actorSystem)

  lazy val userWSRoutes = new WSRouters.User.UserRouter(userRepositoryController) //I am using SIRD router, so creating them here

  lazy val router = new Routes(httpErrorHandler, homeController,userWSRoutes, countController,asyncController, assets) //answer to 2


}