如何将 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
}
我有一个控制器。我想传递一个 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
}