2012-12-24 19 views
9

Tôi đã tạo một dịch vụ OSGI với các dịch vụ khai báo để tiêm một đối tượng thực hiện một giao diện. Nếu tôi tiêm các đối tượng trong một lớp học được gắn vào các mô hình ứng dụng (xử lý, một phần, ....) nó đang làm việc tốt. Nếu tôi tiêm nó trong một lớp không gắn với mô hình ứng dụng, nó luôn luôn trả về null.Làm thế nào để sử dụng nhật thực 4 DI trong các lớp học không được gắn vào mô hình ứng dụng?

Có thể sử dụng DI trong các lớp không được đính kèm với mô hình ứng dụng không? Tôi nhìn vào các hướng dẫn vogella nhưng bằng cách nào đó tôi không tìm thấy một giải pháp.

Trả lời

6

Tôi biết trong ba cách như thế nào Eclipse 4 có thể tiêm các đối tượng trong lớp học của bạn:

  1. Trong start-up thời gian chạy Eclipse tìm kiếm chú thích liên quan trong lớp nó instantiates.
  2. Đối tượng được tiêm trong 1. được theo dõi và sẽ được tiêm lại nếu được thay đổi.
  3. Kích hoạt thủ công việc tiêm bằng ContextInjectionFactory và IEclipseContext.

Điều bạn muốn có thể thực hiện được với tùy chọn thứ ba. Here là ví dụ về mã:

ManipulateModelhandler man = new ManipulateModelhandler(); 

    //inject the context into an object 
    //IEclipseContext iEclipseContext was injected into this class 
    ContextInjectionFactory.inject(man,iEclipseContext); 

    man.execute(); 

Vấn đề là, tuy nhiên; IEclipseContext đã cần được tiêm vào một lớp có thể truy cập đối tượng cần tiêm. Tùy thuộc vào số lần tiêm cần thiết, có thể hữu ích hơn khi sử dụng ủy nhiệm thay vào đó (kiểm thử sẽ là một đối số).

@Inject 
    public void setFoo(Foo foo) { 
     //Bar is not attached to the e4 Application Model 
     bar.setFoo(foo); 
    } 

Do đó, giải pháp tốt hơn có thể là sử dụng chú thích @Creatable. Đơn giản chỉ cần chú thích lớp của bạn và cho nó một hàm tạo không có đối số.

@Creatable 
    public class Foo { 
     public Foo() {} 
    } 

Sử dụng @Inject trên loại đó như trong phương pháp trên, sẽ cho phép Eclipse khởi tạo và tiêm nó. Điểm bất lợi là bạn không thể kiểm soát việc tạo đối tượng nữa, như bạn làm với ContextInjectionFactory.inject (..).

+0

Chỉ cần một lưu ý nhỏ mà hầu hết mọi người có thể muốn xem tiêm javax.inject.Provider vào lớp có chứa yêu cầu các trường hợp tiêm, như là một thay thế cho 3. –

+1

Làm thế nào có thể Tôi nhận được 'IEclipseContext' nếu câu lệnh' ContextInjectionFactory.inject (man, iEclipseContext) 'đang chạy trong một lớp không được định nghĩa trong Mô hình ứng dụng? – kenshinji

+0

@kenshinji Có lẽ [câu trả lời] này (https://stackoverflow.com/questions/18316970/how-to-get-the-ieclipsecontext-in-an-activator/33230722#33230722) sẽ giúp bạn. Nhưng điều quan trọng là chỉ ra rằng điều này sẽ không cho bạn bối cảnh _the_, mà là bối cảnh _a_. Eclipse giữ một cây của các đối tượng bối cảnh, và có hay không một trong số chúng chứa các giá trị bạn cần, tùy thuộc vào trường hợp sử dụng của bạn. Có thể có một cái nhìn tại 'E4Application.createDefaultContext()' là tốt. –

0

Tôi đã tái cấu trúc một số phần của e (fx) clipse để đạt được điều đó. Hãy xem this. Xin lỗi cho các plug shameless ...

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