2011-03-01 5 views
2

여러 도메인 클래스의 업데이트에 서비스가 사용됨을 읽었습니다. 그러나, 나는 명령 클래스를 가지고 있으며, 트랜잭션 업데이트를 만드는 로직을 명령 클래스에 넣는 것이 중요한 단점을 가지고 있는지 (또는 Grails 패러다임을 깨뜨리는 지) 알고 싶습니다. 뭔가 같이 :Grails에서 업데이트 용 명령 객체 사용

class ObjectOneCommand { 
... 
    def save() { 
     objectOneInstance.save() 
     objectTwoInstance.save() 
    } 
} 

그리고 컨트롤러에

ObjectOne.withTransaction { transactionStatus -> 
    objectOneCommand.save() 
} 

답변

4

나는 Grails는 만 새로운 해요,하지만 내가 이해에서, 명령 개체는 기본적으로 데이터 바인딩 수신을 할 수있는 현명한 방법입니다 매개 변수를 추가하여 유효성을 검사하거나 처리 할 수 ​​있습니다. 본질적으로 그것은 도메인 클래스 자체에서 도메인 모델 제약 조건 검사를 받고 속성을 지속성을 위해 도메인 객체에 전달하기 전에 (종종 서비스를 통해) 전달합니다.

따라서 명령 개체 (어쨌든 나를위한)는 도메인 개체의 트랜잭션 비즈니스 논리를위한 장소가 아닙니다.

또한 서비스가 다른 클래스에 삽입 될 수 있으므로 이러한 방식으로 서비스에서 비즈니스 로직을 재사용 할 수 있습니다. 논리를 명령 객체에 배치하면 종속성 삽입이 옵션이 아니며 다른 명령 객체간에 논리를 복제 할 수도 있습니다.

그래서 명령 클래스에 서비스를 삽입 할 수 있으므로 해당 경로를 내려가는 것이 좋습니다.

0

일반적으로 Grails 패러다임 및 대부분의 MVC 패러다임에 위배됩니다. Ciaran이 지적했듯이, 명령 및 컨트롤러 클래스에 넣은 논리는 재사용 할 수 없습니다. 다른 컨트롤러 (쉽게)에서 호출 할 수 없으므로 아마 다시 작성해야 할 것입니다. def transactional = true으로 서비스 지속성을 유지하는 방법을 만드는 것이 훨씬 낫습니다.

0

작성자 David Dawson이 명령 개체를 사용하여 들어오는 요청을 모델링하고 요청 기간 동안 상태를 유지할 것을 제안하는 곳을 확인하십시오. 좋은 생각인지 나쁜 생각인지 확실하지 않지만 설명하는 내용과 매우 유사합니다.

http://www.simplicityitself.com/article/all-hail-command