2009-03-26 45 views
7

Tôi đã suy nghĩ một số về "thực hành tốt" về cấu trúc gói trong gói osgi. Hiện tại, trung bình, chúng tôi có 8-12 lớp học cho mỗi nhóm. Một trong những sáng kiến ​​/ đề xuất của tôi là có hai gói; com.company_name.osgi.services.api (đối với các lớp/giao diện liên quan đến api (được xuất ra bên ngoài) và một gói com.company_name.osgi.services.impl để triển khai (không được xuất)). Ưu điểm của điều này là gì? Bất cứ một đề nghị nào khác?Cấu trúc gói của gói OSGi

Trả lời

6

Bạn cũng có thể xem xét đặt các giao diện trong com.company_name.subsystem và triển khai trong com.company_name.subsystem.impl, mã cụ thể OSGI, nếu có, có thể là com.company_name.subsystem.osgi. Thỉnh thoảng bạn có thể triển khai nhiều giao diện giống nhau. Trong trường hợp này, bạn có thể xem xét - com.company_name.subsystem.impl1com.company_name.subsystem.impl2, ví dụ:

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 

trong cấu trúc gói cảm giác này có thể là OSGi thuyết bất khả tri, nếu bạn sau này chuyển sang một container khác nhau, bạn chỉ cần đặt thêm

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

Luôn có apiimpl trong tên gói của bạn có thể gây phiền toái. Nếu nghi ngờ sử dụng impl nhưng không sử dụng api.

2

Đây không phải là số lớp quan trọng mà là các khái niệm. Theo tôi, bạn nên có một thực thể khái niệm trong một gói. Trong một số trường hợp, đây có thể chỉ là một vài lớp trong một số gói khác với 100 lớp.

Điều quan trọng là bạn tách API và triển khai. Một gói chứa API của khái niệm của bạn và API kia thực hiện. Như thế này, bạn có thể cung cấp các triển khai khác nhau cho một API được xác định rõ. Trong một số trường hợp, điều này thậm chí có thể cần thiết nếu bạn muốn truy cập các dịch vụ từ một gói từ xa (ví dụ: R-OGSi)

Các gói API sau đó được sử dụng bằng cách chia sẻ dịch vụ. Cách tốt nhất để khám phá những khả năng đó là nhìn vào ServiceTrackers.

0

Trong trường hợp của bạn, bạn có thể thực hiện trong cùng một gói, nhưng tất cả các lớp học của nó là "gói được bảo vệ". Bằng cách này, bạn có thể xuất gói và việc triển khai sẽ không hiển thị bên ngoài, ngay cả khi không sử dụng OSGi (nhưng dưới dạng tệp jar bình thường).

Các vấn đề liên quan