【问题标题】:issue with injecting grails service in domain class在域类中注入 grails 服务的问题
【发布时间】:2012-03-13 22:59:17
【问题描述】:

我正在尝试将“GraauditService”注入 grails“用户”域类。
我正在使用 grails 1.3.7 我已经尝试过直接注入方法,就像在控制器中所做的那样
导入 com.gra.audit.GraauditService

class User {
def graauditService // or even GraauditService graauditService with graauditService as transient
.......

上述方法不起作用。 graauditService 总是显示为空

我也尝试通过ApplicationHolder注入如图here

但现在看来 ApplicationHolder 已被弃用

如何在域类中使用服务?

【问题讨论】:

  • 你不应该这样做,传统的 Web 架构类似于 microkernel pattern,其中域是内核。长话短说:领域类处理“业务领域”逻辑,有时面向领域的服务充当外观,提供涉及领域的常见操作。这就是为什么 Grails 不会在域类上注入服务的原因,从那里调用它们是不行的。无论您尝试做什么,它可能更适合在服务层中完成。您能否详细说明您需要实现的目标?
  • 我正在尝试为该域类的各种事件添加审计日志条目,例如保存、删除、加载..等
  • @Esteban Grails 不会将服务注入到 Grails 域类中是不正确的。在我的应用程序中,我成功地将springSecurityService 注入到我的域类中,这样我就可以在保存用户密码之前对其进行编码。我不同意您的说法,即将服务注入域类始终是一种不好的做法
  • 我相信你的论点不是很强,你为什么要这么做?我不适合贫血的域类,但将服务注入域类会产生依赖循环,这通常不是一个好的架构决策。 @pri_dev:这是在 Grails 中优雅地实现基于事件的审计拦截器的方法:Inside Hibernate Events。在我看来,普通密码不应该由服务器处理。为什么不在客户端或一到达服务器就对密码进行编码?

标签: grails service dependency-injection


【解决方案1】:

以下对我有用

class User {

    def springSecurityService
    static transients = ['springSecurityService']
}

【讨论】:

  • 啊,我在看 Grails 2.0。忘了他们是从 1.3.7 改过来的。
  • 当我从 ApplicationHolder 获得服务时,它对我有用。暂时这样就好了。。
【解决方案2】:

尝试使用瞬态关键字注入它:

class User {
   transient graauditService 
}

【讨论】:

  • 它仍然显示为 null,当我使用 ApplicationHolder 方法时它显示为非 null 但是它没有在服务中调用该方法?
  • 此服务是否可以注入控制器?该服务的实际类名是什么?
  • slass 名称是 GraauditService,控制器 GraauditService graauditService 中的以下声明工作正常。
【解决方案3】:

对于 Grails 1.3.7,解决方案是通过 ApplicationHolder 注入它,如 Burt Beckwith 的 here 所示。

上述解决方案可能适用于 Grails 2.0,但不适用于 1.3.7 或更早版本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    • 1970-01-01
    • 1970-01-01
    • 2015-12-08
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多