Scala 如何获取对当前控制器的引用?
假设我有一个控制器,它依赖于地理定位服务从请求中获取用户位置:Scala 如何获取对当前控制器的引用?,scala,dependency-injection,playframework-2.4,Scala,Dependency Injection,Playframework 2.4,假设我有一个控制器,它依赖于地理定位服务从请求中获取用户位置: class Application extends Controller { @Inject var geo : GeoService def index = Action { implicit request => Ok(geo.userLocation(request).toString()) } } GeoService的界面如下所示: trait GeoService {
class Application extends Controller {
@Inject var geo : GeoService
def index = Action { implicit request =>
Ok(geo.userLocation(request).toString())
}
}
GeoService的界面如下所示:
trait GeoService {
def userLocation(request : Request) : LocInfo // detect user location from incoming http request
}
绑定到上述特性的GeoService的特定实现
class Locator extends GeoService {
@Inject var controller : Controller
def userLocation(request : Request) : LocInfo = {
// .... check cookies included in the request to see if location is previously set
}
}
我希望重用Playframework的基本控制器实现提供的会话方法,以获得传入请求提供的会话:
controller.session(request)
因此,我假设必须将处理请求的控制器实例注入定位器类
但我不知道如何确保注入的控制器实例就是生成处理请求的操作的控制器来实现这一点
此外,定位器和应用程序控制器之间存在循环依赖关系。是否有更好的实施建议
多谢各位 任何无法修改userLocation方法以接受额外控制器或会话参数的原因?+1 Shadowlands,只需将会话发送到您的服务。告诉我不要问暗影世界,我想有一个更好的抽象层次。由于明确依赖于play中的控制器或会话,因此GeoService接口仅可用于play应用程序。理想情况下,我希望geoservice实现能够从HTTP请求中识别用户位置。在上面的示例中,定位器是PlayFramework应用程序的特定实现。经过一些研究,我想解决这个问题的一种方法是使用某种请求作用域将控制器注入定位器的构造函数中,但我不确定如何进行。您可以在动作中创建一个新定位器-如果它不维护状态,并且不是一个特别复杂的实体,这不太可能对性能/GC造成重大影响。构造调用可以通过注入控制器的工厂来完成,以保留DI抽象。