Grails(10)Guide Book Chapter 9 The Service Layer

Grails(10)Guide Book Chapter 9 The Service Layer
9. The Service Layer - Reference Documentation

Services in Grails are the place to put the majority of the logic in your application, leaving controllers responsible for handling request flow with redirects and son on.

Creating a Service
>grails create-service hellowworld.simple
It will automatically create a service class in grails-app/services/hellowworld/SimpleService.groovy

Default Declarative Transactions
All services are transactional by default, to disable this set the transactional property to false:
class CountryService {
static transactional = false
}

Grails also fully supports Spring's Transactional annotation for cases.

import org.springframework.transaction.annotation.Transactional

class BookService {
@Transactional(readOnly=true)
def listBooks(){}

@Transactional
def updateBook(){}
}

better way

@Transactional
class BookService {
@Transactional (readOnly=true)
def listBooks(){}

def updateBook(){}

def deleteBook(){}
}

Validation Errors and Rollback
A common use case is to rollback a transaction if there are validation errors.
import grails.validation.ValidationException

class AuthorService {
void updateAge(id, int age) {
def author = Author.get(id)
author.age = age
if(!author.validate()){
throw new ValidationException("Author is not valid", author.errors)
}
}
}

import grails.validation.ValidationException

class AuthorController {
def authorService

def updateAge(){
try{
authorService.updateAge(params.id, params.int("age"))
}catch(ValidationException e){
def author = Author.read(params.id)
author.errors = e.errors
render view:"edit", model: [author: author]
}
}
}

9.2 Scoped Services
prototype - A new service is created every time it is injected into another class
request
flash
flow
conversation - in web flows the service will exist for the scope of the conversation.
session
singleton(default)

configure the scope with this code
static scope = "flow"

9.3 Dependency Injection and Services
Dependency Injection Basics
A key aspect of Grails services is the ability to use Spring Framework's dependency injection features.

class BookController {
def bookService
...
}

Dependency Injection and Services
We can inject services in other services with the same technique.

class AuthorService {
def bookService
}

Dependency Injection and domain classes
We can even inject services into domain classes and tag libraries.
class Book{

def bookService

def buyBook(){
bookService.buyBook(this)
}
}

9.4 Using Services from Java
We have java interface, all the groovy service.

10. Testing
Automated testing is a key part of Grails. Hence, grails provides many ways to making testing easier from low level unit testing to high level functional tests.

When we create a controller with command we will automatically create a test class for controller
>grails create-controller com.sillycat.simple

grails-app/controllers/com/sillycat/SimpleController.groovy
test/unit/com/sillycat/SimpleControllerTests.groovy

Running Tests
>grails test-app

Targeting Tests
>grails test-app SimpleController

>grails test-app *Controller

>grails test-app com.sillycat.*Controller

>grails test-app com.sillycat.*

run all the tests in a package including sub packages…
>grails test-app com.sillycat.**.*

target particular test methods
>grails test-app SimpleController.testLogin

10.1 Unit Testing

10.1.1 Unit Testing Controllers

10.1.2 Unit Testing Tag Libraries

10.1.3 Unit Testing Domains

10.1.4 Unit Testing Filters

10.1.5 Unit Testing URL Mappings

10.2 Integration Testing

Simulating Request Data

Testing Web Flows

10.3 Functional Testing
Canoo Webtest - http://grails.org/plugin/webtest
G-Func http://grails.org/plugin/functional-test
Geb - http://grails.org/plugin/geb
Selenium-RC - http://grails.org/plugin/selenium-rc
WebDriver - http://grails.org/plugin/webdriver


References:
http://grails.org/doc/latest/guide/index.html
http://grails.org/doc/latest/guide/services.html
http://grails.org/doc/latest/guide/testing.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值