2010-01-23 3 views
1

인터페이스, FooProvider를 정의한 다음 런타임에이 인터페이스의 여러 구현을 사용할 수 있다고 가정합니다 (개별 서비스 일 수 있음). 내 컨트롤러 클래스에서 런타임에 주입 된이 인터페이스의 모든 알려진 구현을 가질 수 있기 때문에 다른 유형의 "Foo"항목을 가져 오는 데 "옵션"으로 사용자를 표시 할 수 있습니다. 이렇게하면 서버 측 코드가 훨씬 더 모듈화되어 여러 사용자가 FooProvider 서비스를 서로 다른 방법으로 정의 할 수 있습니다.Grails 내에 내 자신의 플러그인 아키텍처를 갖고 싶다면 어떻게해야합니까?

내가보기에 Grails는 컨트롤러/도메인 클래스에 서비스 구현의 단일 인스턴스를 주입하는 옵션 만 제공합니다. Grails가 인터페이스 유형에 기반한 여러 서비스 인스턴스를 삽입 할 수있는 방법이 있습니까? OSGi 컨테이너에서 사용할 수있는 인터페이스의 구현을 삽입 할 수있는 OSGi의 기능과 병행한다고 생각합니다.

답변

1

Grails는 아래에 Spring을 사용하므로 Spring을 알고 있으면 원하는만큼 많은 서비스를 컨트롤러에 삽입 할 수 있습니다.

하지만 그렇게하지 않을 수있는 좋은 이유가 있다고 생각합니다. 여러 서비스를 컨트롤러에 넣기 시작하면 컨트롤러가 호출되는 순서를 대신합니다. 그 시점에서 나에게 워크 플로우처럼 들리지만, 서비스에 가장 남을 수 있습니다.

컨트롤러는 웹 계층의 일부입니다. 웹 티어가 컨트롤러에 묻혀있는 경우 다른 채널을 통해 들어오는 클라이언트에게 프로세스를 노출 할 수 없습니다.

가능한 경우에도이 작업을 수행하지 않는 것이 좋습니다. 더 나은 아이디어는 다른 서비스에서 복잡한 유스 케이스처럼 들리는 것을 드러내는 것입니다. 이를 캡슐화하고 고객으로부터 세부 사항을 숨 깁니다. 그것이 바로 객체가 갖는 목적입니다.

+0

충분합니다. 그렇다면 모든 구현을 외관 서비스에 주입하려면 어떻게해야합니까? 서비스 제공자가 플러그인 공급자를 통해 제공되는 모든 "Foo"를 제공하고 사용자가 원하는 "Foo"항목을 선택할 수있게하려는 경우 ... 내 Grails 계층 구조에서 서비스에 삽입 할 항목을 정의 할 수 있습니까? 팁 고마워! – Mike

1

내가 원하는 것만 큼 ... 사용자 지정 아티팩트 (Foo)를 제공하는 플러그인을 만들고 개발자가 새 인스턴스 (MyFoo, YourFoo)를 만들 수있는 스크립트를 제공하고 기본 클래스를 확장하는 이슈 템플릿이 있습니다 (인터페이스를 구현할 수 있음). 그런 다음 Grails가 시작되면 모든 Foo 아티팩트가 발견되고 FooService에는 "application.getFooClasses()"를 반환하는 getFooList() 메서드가 있습니다 ... FooController에서 해당 목록을 가져 와서 선택 영역을 채우는 UI로 전달합니다. 명부. 사용자가 이름 하나를 선택 후, FooService 인터페이스 또는 기본 클래스의 모든 구현이 발견되어 있는지 확인하지 않습니다 분명히이

def clazz = ApplicationHolder.application.getFooClass(name) 
    myFoo = clazz?.newInstance() 

와의 인스턴스를,하지만 내 FooService는 사용자가 선택할 수있는 수 있습니까 확장 가능한 구현 목록.

관련 문제