2011-10-29 8 views
2

내가 10 개의 grails 서비스를 가지고 있다고 가정 해 봅시다. 이 서비스들 각각은 REST 서비스를 호출 할 것입니다. 그래서 REST 코드를 캡슐화하여 10 개의 서비스에서 쉽게 다시 사용할 수 있도록하고 싶습니다. 고려 옵션에서grails 서비스 계층 구조

, I 수 :

1) REST 관련 코드와 다른 서비스 나 콩을 만들고 그것에게 (10 개) 서비스의 모든 일을 주입.
2) REST 코드를 포함하는 수퍼 클래스 서비스를 만들고 10 개의 모든 grails 서비스가이 클래스를 확장하도록한다.

나는 옵션 2와 함께 가고 싶지만, 수퍼 클래스에 의존성 주입 문제가있다.

예 :

class SuperService { 
    def aString 
} 

class ExampleService extends SuperService { 
} 

resources.groovy :

beans = { 
    superService(SuperService) { 
     aString = "something" 
    } 
    exampleService(ExampleService) { 
    } 
} 

통합 테스트를 실행하는 동안 내가 디버거에서이 프로그램을 실행할 때, 나는 aString의 값이 null 참조하십시오. 분명히 그것은 나를 위해 문제가 될 것입니다.

당신이 다음 resources.groovy과 같은 코드를 실행, 예상대로

= "뭔가"

beans = { 
    superService(SuperService) { 
    } 
    exampleService(ExampleService) { 
     aString = "something" 
    } 
} 

및 aString.

그래서 구성 배선이 적어지기 때문에 옵션 2를 선호합니다.하지만 필자는 이것이 실현 가능한 접근 방식이 될 것이라고 생각하지 않습니다. 즉, 각 하위 클래스에 aString을 설정해야하는 경우 아무런 가치가 없습니다.

생각하십니까?

내가 누락 된 항목이 있습니까?

다른 옵션도 있습니다. 사전에

감사합니다, 토드

+0

왜 옵션 2의 구성 배선이 덜 것이라고 생각합니까? –

답변

0

당신은 DRY 인 측면에서 옵션 # 2 올바른 생각을 가지고 -하지만 정말 하나 개의 라인입니다. superService 객체와 공통된 점은 서비스 뿐이며 다른 메소드가 없다면 실제로 어떤 작업을하지 않아도됩니다. 무엇이든간에, 의존성 주입을위한 수퍼 클래스를 선언하면 더 많은 것을 숨기고 유지하기가 더 어려워 질 수 있습니다.

superService에 REST 메서드를 두는 것과 같이 들릴지 모르겠지만 superService에 대한 종속성 주입이 걱정되는 이유는 확실하지 않습니다. 거기에있는 메소드가 하위 클래스와 REST 상호 작용을 수행하기를 원합니다. 통화 할 수 있습니다. 또는 옵션 1과 2의 조합을 시도하고 있습니까?

+0

superService에서 springSecurityService 또는 Spring Security 플러그인에서 제공하는 util 또는 holder 객체 중 하나에 액세스해야합니다. 이 superSerivce는 나머지 호출을하기 전에 누가 로그인했는지 알아야합니다. 금요일에, 나는이 superService가 보안을 사용할 때 항상 NPE를 가져 오지 못했습니다. 내 문제는 의존성 주입으로 생각합니다. –

+0

음, 오늘 아침에 다음 코드가 superClass에서 작동합니다. def ctx = AH.application.mainContext SpringSecurityService springSecurityService = ctx.springSecurityService def loggedInUser = springSecurityService.getPrincipal() –

+0

흥미 롭습니다. 나는 주사가 superService로 작동하지 않았다는 것을 아직도 놀랜다. Grails 2.0.RC1을 사용하고 있습니까? 또는 1.3.7? – Todd