2014-09-25 3 views
2

나는 여러 도메인 클래스가있는 Grails 프로젝트를 가지고 있으며, 그 안에 하나의 save() 만 있으면 가능한 한 재사용 가능한 서비스로 만들고 싶습니다. 이 작업을 시도하고 수행하려면 프로젝트에서 다음을 수행했습니다.Grails 재사용 가능한 도메인 객체 저장 서비스

//PersistenceService.groovy

@Transactional 
class PersistenceService { 
def create(Object object) {   
    object.save flush: true 
    object 
} 

// BaseRestfulController

class BaseRestfulController extends RestfulController { 

def persistenceService 

def save(Object object) { 
    persistenceService.create(object) 
} 

// BookController는

class BookController extends BaseRestfulController { 

private static final log = LogFactory.getLog(this) 

static responseFormats = ['json', 'xml'] 

BookController() { 
    super(Book) 
} 

@Transactional 
def save(Book book) { 
    log.debug("creating book") 

    super.save(book) 

} 

그래서 기본적으로 내가 예를 들어, 저자에 대한 도메인의 무리가 등 각 bookController와 비슷한 자체 컨트롤러가 있습니다. 위와 같이 시도하는 것처럼 지속성을 위해 서비스를 재사용 할 수있는 방법이 있습니까?

내가 비슷한 일을하고 있어요

+0

나는 할 수 있다고 생각하지만 당신은 당신의 BaseRestfulController 클래스에 (def 객체)를 생성하기위한 create (Object 객체)와 save (defobject)라는 save (Object 객체)의 서명을 변경해야합니다. –

+1

'def'는 메소드 서명의'Object' 또는 타입 정보와 동일합니다. 3 개의 메소드는 정확히 같습니다 :'create (o)'==='create (Object o)'==='create (def o)' – injecteer

+1

@ user2816352 여기서 달성하고자하는 것을 이해하지 못합니다. – injecteer

답변

2

주셔서 감사합니다,하지만 내 모든 개체가 실제로 오히려 데이터베이스에서 제거되지 않지만 주로하기 때문에 제거로 "표시". 여러 앱의 경우 데이터 손실을 막는 것이 중요하므로 이러한 접근 방식이 필요합니다.

대부분의 데이터베이스는이 시나리오를 지원하지 않으므로 상위 도메인을 제거 할 때 외래 키를 사용하여 종속 도메인 인스턴스를 제거 할 수 없습니다. 그래서 나는 GenericDomainService라는 기본 서비스 클래스에 저장, 삭제 (마크), 삭제 취소 (마크 해제) 메소드를 가지고있다.

이 서비스는 모든 도메인에 적용 할 수있는 기본 구현을 제공합니다. (존재하지 않을 수있는) 일반 플러스 콘크리트 :

class GenericDomainService { 

def save(instance) { 
    if(!instance || instance.hasErrors() || !instance.save(flush: true)) { 
     instance.errors.allErrors.each { 
      if(it instanceof org.springframework.validation.FieldError) { 
       log.error "${it.objectName}.${it.field}: ${it.code} (${it.rejectedValue})" 
      } 
      else { 
       log.error it 
      } 
     } 
     return null 
    } 
    else { 
     return instance 
    } 
} 

def delete(instance, date = new Date()) { 
    instance.dateDisabled = date 
    instance.save(validate: false, flush: true) 
    return null 
} 

def undelete(instance) { 
    instance.dateDisabled = null 
    instance.save(validate: false, flush: true) 
    return null 
} 

} 

그런 다음 내 컨트롤러 템플릿에 난 항상 두 가지 서비스를 선언

:에 책이라는 도메인에 대한 번역 할
def ${domainClass.propertyName}Service 
def genericDomainService 

def service = bookService ?: genericDomainService 
service.save(instance) 
: 내가 좋아하는 서비스를 사용하는 컨트롤러의 방법 내에서
def bookService 
def genericDomainService 

마지막으로, 주어진 도메인에 대한 서비스는 이러한 작업을 위해 (필요한 경우) 사용자 지정 논리를 제공하는이 일에서 상속됩니다 도움이

class BookService extends GenericDomainService { 

def delete(instance, date = new Date()) { 
    BookReview.executeUpdate("update BookReview b set b.dateDisabled = :date where b.book.id = :bookId and b.dateDisabled is null", [ date: date, bookId: instance.id ]) 
    super.delete(instance, date) 
} 

def undelete(instance) { 
    BookReview.executeUpdate("update BookReview b set b.dateDisabled = null where b.dateDisabled = :date and b.book.id = :bookId", [ date: instance.dateDisabled, bookId: instance.id ]) 
    super.undelete(instance) 
} 

} 

희망을.

관련 문제