2012-11-17 31 views
5

Tôi đã viết một gói OSGi để sử dụng nó trong ứng dụng nhật thực 4 rcp của tôi. Việc sử dụng các dịch vụ hoạt động tốt nếu tôi thêm các phụ thuộc, đăng ký các dịch vụ này trong activator của tôi và tiêm nó trong lớp học của tôi.Eclipse RCP 4 sử dụng gói thông qua dịch vụ khai báo

Trong activator

IUserService service = new TestUserService(); 
context.registerService(IUserService.class.getName(), service, null); 

Trong lớp học của tôi

@Inject 
IUserService service; 

service.getSth(); 

tôi đọc rằng việc sử dụng các gói dịch vụ thông qua khai báo nên là cách tốt hơn. Vì vậy, thay đổi thực hiện của tôi. Tôi tạo ra một định nghĩa thành phần trong gói của tôi để cung cấp dịch vụ của tôi:

<?xml version="1.0" encoding="UTF-8"?> 
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="usermanagement.test"> 
    <implementation class="usermanagement.test.TestUserService"/> 
    <service> 
     <provide interface="usermanagement.IUserService"/> 
    </service> 
</scr:component> 

Sau đó, tôi bỏ việc đăng ký dịch vụ từ hoạt của tôi và tạo ra một lớp dịch vụ tiêu dùng:

public class UserServiceConsumer { 

    private IUserService service; 

    public synchronized void setQuote(IUserService service) { 
     this.service = service; 
    } 

    public synchronized void unsetQuote(IUserService service) { 
     if (this.service == service) { 
      this.service = null; 
     } 
    } 

} 

và một định nghĩa thành phần:

<?xml version="1.0" encoding="UTF-8"?> 
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="UserServiceConsumer"> 
    <implementation class="services.UserServiceConsumer"/> 
    <reference bind="setService" cardinality="1..1" interface="usermanagement.IUserService" name="IUserService" policy="static" unbind="unsetService"/> 
</scr:component> 

Sau khi sửa đổi, việc tiêm dịch serivce của tôi không còn hoạt động nữa. Vấn đề là tham chiếu dịch vụ được tiêm là NULL mọi lúc.

Có ai biết tại sao không? Tôi đã quên một cái gì đó?

Cảm ơn rất nhiều!

Trả lời

2

Tôi có thể đề xuất một vài điều bạn có thể làm để gỡ lỗi.

  1. Bạn có thực sự triển khai scr trong thời gian chạy không? SCR (một tên khác cho các dịch vụ khai báo) không được bao gồm trong lõi Equinox, vì vậy bạn sẽ cần phải bao gồm nó. Hầu hết mọi người sử dụng bó Felix SCR - nó sẽ ngồi rất hạnh phúc trên đỉnh của Equinox.

  2. Vì dịch vụ khai báo chỉ sử dụng dịch vụ, bạn có thể thay đổi một nửa ứng dụng của mình cùng một lúc để xác định xem đó là tiêu thụ dịch vụ hoặc đăng ký không hoạt động.

  3. Bạn cũng có thể sử dụng bảng điều khiển Equinox để kiểm tra đăng ký dịch vụ của mình. Sử dụng 'ss' để xác định gói của bạn, sau đó 'bundle [no]' để xem những dịch vụ nào được đăng ký và sử dụng. Nếu bạn đang sử dụng Felix SCR, cũng có phần mở rộng Console Equinox, vì vậy bạn có thể sử dụng 'danh sách scr' để xem tất cả các dịch vụ mà một gói cố gắng đăng ký (và trạng thái của chúng) và 'thông tin scr' để biết thêm chi tiết về một dịch vụ.

2

Tôi nghĩ rằng các dịch vụ khai báo sẽ không hoạt động trong lớp UI của bạn vì SCR sẽ không được tạo ra bởi Eclipse. Vì vậy, những gì bạn có thể thử là để lại giao diện người dùng như với @Inject và chỉ thay đổi gói cung cấp dịch vụ để sử dụng DS.

Về cơ bản tôi thậm chí sẽ không cố gắng thay đổi giao diện người dùng. Ký hiệu @Inject ít chi phí hơn nhiều so với các dịch vụ khai báo.

+0

Bạn suy ra rằng OP muốn sử dụng dịch vụ trong lớp UI như thế nào? – tkotisis

+0

Tôi sử dụng DI để tạo một thể hiện của lớp của tôi bằng cách sử dụng chú thích @Creatable trên hàm tạo của lớp. – roschulze

+0

@tkotsis nếu bạn sử dụng RCP Eclipse sau đó thường để xây dựng một GUI –

3

Tôi đã tìm thấy giải pháp.

Trong file manifest của dịch vụ của tôi, tôi đã thêm dòng sau:

Bundle-ActivationPolicy: lazy 

Sau đó userServiceConsumer và định nghĩa thành phần trong ứng dụng của tôi là không cần thiết.

Trong một lớp học xem tôi có thể làm như sau bây giờ:

public class MyPart { 

    private IUserService uServ; 

    @Inject 
    public MyPart(IUserService uServ) { 
     this.uServ = uServ; 
     if (uServ != null) 
      System.out.println("UserService available"); 
     else 
      System.out.println("UserService == null"); 
    } 

Via DI dịch vụ của tôi được tiêm trong constructor của xem. Nó ổn với tôi!

+0

Nếu điều đó giải quyết được vấn đề của bạn, bạn cũng nên chấp nhận nó. –

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