我是Grails的新手,正在构建一个应用程序。我有一套明确定义的域类和控制器,到目前为止工作得很好,但我现在需要添加一些用户首选项和设置,我希望能够从任何一个访问控制器。什么是最好的,最像Grails的方式来实现这个目标?
示例:我有一个RequestController,它接受上传的文件并将它们保存到Settings对象中设置的本地目录。在这种方法中,我该如何获得该对象?
def save() {
String fileStoragePath = Settings.get(0).fileStoragePath // How do I do this?
def requestInstance = new Request(params)
def uploadedFile = request.getFile('payload')
if (! new File(fileStoragePath).mkdirs()) {
// TODO: Handle this error condition appropriately
}
if (uploadedFile && !uploadedFile.empty) {
uploadedFile.transferTo(new File(fileStoragePath, uploadedFile.originalFilename))
requestInstance.files << uploadedFile.originalFilename
}
虽然我确信我可以做一些有用的事情,但我宁愿在成语中做到这一点,如果可能的话。我一直在寻找Java语法潜入我的Groovy,并定期擦洗以摆脱它,因为它突然出现....
更新
我也在这里看到(Grails instantiates object and uses in Controllers)可以将bean定义为单例并且可以从任何地方访问它。这可能吗?或者这样做是否意味着我失去了通过通常的Controller / View配置将bean呈现给用户的能力?
谢谢!
答案 0 :(得分:2)
鉴于用户有首选项,我会将其建模为我的域的一部分。根据您的要求,首选项可以具有良好定义的属性,或者只是字符串键值对的集合。从那里我将手动在需要访问它的控制器中公开UserPreferenceService(使用依赖注入)或通过元编程将其添加到Bootstrap.groovy中的所有控制器。
这种方式在任何控制器中都可以轻松完成:
String fileStoragePath = userPreferenceService.resolve('storage.path')
上面的示例假定当前用户解析是在内部完成的(可能使用Spring Security)。
此外,通过将其抽象为服务,它可以应用缓存,在其他服务或标记库中使用,等等。
希望这有助于给你一些想法。