gpt4 book ai didi

grails - 如何将类似服务的组件注入(inject) Grails 域对象?

转载 作者:行者123 更新时间:2023-12-02 14:23:40 25 4
gpt4 key购买 nike

我以前从未使用过 Grails 服务,但根据我的 Web 搜索,它们可以注入(inject)到域对象中。因此,如果我有以下域类(假设 BookService 在某处定义),

class Book {

BookService bookService

}

当我实例化一个 Book对象使用, def book = new Book() , book.bookService应该设置?

如果是这样的话,如果我想注入(inject)外部服务(或类似服务的组件)怎么办?例如,如果有可用的 ISBN API 客户端,我可以期望 grails 以同样的方式注入(inject)它吗?例如,假设客户是 IsbnApi ,我如何像其他服务一样自动注入(inject)?下面的代码会起作用吗?
class Book {

@Transient
@Autowire
IsbnApi isbnApi

}

根据之前对这个问题的回答,我已经以这种方式定义了域类:
class Book {

static transients = ['isbnApi']

IsbnApi isbnApi

}

现在,这可能就是我所需要的,但我还想测试自动注入(inject)是否可以工作,即使无需运行应用程序。在我的单元测试中,我必须手动设置模拟“服务”。
IsbnApi isbnApi = Mock()
Book book = new Book()
book.isbnApi = mockIsbnApi

我试图通过将测试移至 test/integration 来检查自动注入(inject)。并使用 doWithSpring 设置 bean .
def doWithSpring() {
isbnApi = (InstanceFactoryBean, mockIsbnApi, isbnApi)
}

void "test automatic injection"() {
given:
IsbnApi isbnApi = Mock()
Book book = new Book()
//removed: book.isbnApi = mockIsbnApi

expect:
book.isbnApi //this fails
}

我还从 this answer to a similar question 中找到了更多信息.尤其,

Note that since you're using 'def' you don't need to add it to the transients list. Are you trying to access it from a static method? It's an instance field, so you can only access it from instances.

最佳答案

按照惯例,Grails 服务自动成为依赖注入(inject)的候选对象(= 它们可以被注入(inject)到其他类中)。如果您想加入其他类(class),您必须将它们添加到 conf/spring/resources.groovy .

例如。:

import foo.bar.IsbnApi

beans = {
isbnApi(IsbnApi)
}

看看 Bean Builder文档部分。

要确保您的字段不被视为持久属性,您可以使用静态 transients field 。

例如:
class User {
def grailsApplication
static transients = ['grailsApplication']
}

transients documentation

关于grails - 如何将类似服务的组件注入(inject) Grails 域对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25967335/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com