문제

나는 OSGI 번들 내의 패키지 구조와 관련하여 "모범 사례"에 대해 생각하고 있습니다. 현재 평균적으로 번들 당 8-12 개의 클래스가 있습니다. 나의 이니셔티브/제안 중 하나는 두 개의 패키지가있는 것입니다. com.company_name.osgi.services.api (API 관련 클래스/인터페이스 (외부로 내보내기) 및 하나의 패키지 com.company_name.osgi.services.impl (내보내지 않음). 이것의 장점은 무엇입니까? 다른 제안이 있습니까?

도움이 되었습니까?

해결책

인터페이스를 넣는 것을 고려할 수도 있습니다 com.company_name.subsystem, 및 구현 com.company_name.subsystem.impl, OSGI 특정 코드가 있으면 com.company_name.subsystem.osgi. 때때로 동일한 인터페이스를 여러 번 구현할 수 있습니다. 이 경우 고려할 수 있습니다. com.company_name.subsystem.impl1 그리고 com.company_name.subsystem.impl2, 예를 들어:

com.company.scm        // the scm api
com.company.scm.git    // its git implementaton
com.company.scm.svn    // its subversion implementation
com.company.scm.osgi   // the place to put an OSGI Activator

이러한 의미에서 패키지 구조는 Osgi Agnostic 일 수 있습니다. 나중에 다른 컨테이너로 이동하면 추가를 추가합니다.

com.company.scm.sca     // or whatever component model you might think of

항상 api 그리고 impl 패키지 이름에서 성가신 일 수 있습니다. 의심스러운 경우 사용하십시오 impl 하지만 api.

다른 팁

중요한 클래스 수가 아니라 개념입니다. 제 생각에는 묶음에 하나의 개념적 엔티티가 있어야합니다. 경우에 따라 이것은 100 개의 클래스가있는 다른 여러 패키지의 몇 가지 클래스 일 수 있습니다.

중요한 것은 API와 구현을 분리하는 것입니다. 한 번들에는 개념의 API가 포함되어 있고 다른 번들에는 구현이 포함됩니다. 이와 마찬가지로 잘 정의 된 API에 대해 다른 구현을 제공 할 수 있습니다. 경우에 따라 번들에서 원격으로 서비스에 액세스하려면 (예 : R-OGSI 사용) 이것은 필요할 수 있습니다.

그런 다음 API 번들은 코드 공유 및 서비스 공유에 의한 구현 번들의 서비스에 의해 사용됩니다. 이러한 가능성을 탐색하는 가장 좋은 방법은 Servicetrackers를 보는 것입니다.

귀하의 경우 동일한 패키지로 구현할 수 있지만 모든 클래스 "패키지 보호". 이렇게하면 패키지를 내보낼 수 있으며 OSGI를 사용하지 않더라도 (일반적인 JAR 파일) 구현은 외부에 표시되지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top