2015-04-07 15 views
23

Tôi đã hỏi (và trả lời) cùng một câu hỏi cho Dagger 1 here. Làm thế nào tôi sẽ làm một cái gì đó tương tự cho Dagger 2, bây giờ mà ObjectGraph.inject không còn tồn tại.Làm cách nào để tiêm vào Servlet với Dagger 2?

Câu hỏi này có thể được khái quát hóa để:

Làm thế nào để bạn thành viên tiêm nếu đối tượng phải được tạo ra bởi một khuôn khổ khác nhau? (trong trường hợp này, một thùng chứa Servlet).

Trả lời

7

Tôi đã cố trả lời cùng một câu hỏi này. Tôi nghĩ tôi đã nhận được gần nó như thế nào "nên" làm việc lý tưởng, nhưng tôi chỉ derping xung quanh dự án GitHub và cố gắng tìm nó ra dựa trên phế liệu của thông tin đó, như rất nhiều tài liệu cho Dagger 2 vẫn đang được viết (tính đến tuần này).

Mã ví dụ của tôi dưới đây thực sự là dành cho Hoạt động trên Android, nhưng tôi tin rằng cách tiếp cận tương tự này cũng có tác dụng đối với servlet bạn đang hỏi.

Thêm thành viên < ...> vào giao diện @Component của bạn; ví dụ, trong các thành phần dưới đây, tôi đã thêm một lớp MainActivity tôi:

package ...; 

import javax.inject.Singleton; 
import dagger.Component; 
import dagger.MembersInjector; 

@Singleton 
@Component(modules = { PlaygroundModule.class }) 
public interface MainComponent { 
    Wizard createWizard(); 
    MembersInjector<MainActivity> mainActivityInjector(); 
} 

Và sau đó trong lớp học của bạn mà bạn muốn trở thành thành viên tiêm, tại một nơi thích hợp sau khi tạo đối tượng nhưng trước khi bạn cần sử dụng các thành viên tiêm, bạn cần để tạo ra các thành phần và sử dụng tiêm thành viên:

package ...; 

// other imports 
import javax.inject.Inject; 
import dagger.MembersInjector; 

public class MainActivity extends ActionBarActivity { 

    @Inject 
    Wizard wizard; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     MainComponent c = DaggerMainComponent.create(); 
     c.mainActivityInjector().injectMembers(this); 

     // other code... 
    } 
} 

một trong những điều tôi không rõ ràng về là liệu mô hình này tạo ra các thành phần bên trong đối tượng đó là nghĩa vụ phải được tiêm vào đúng. Nó không hoàn toàn cảm thấy đúng, nhưng, nó vẫn còn rất linh hoạt vì bạn chỉ ràng buộc chặt chẽ với các thành phần và không phải là các mô-đun. Vì vậy, có lẽ đây là cách tiếp cận chính xác, nhưng có lẽ nó là một chút đi.

+2

Ah; nó cũng có thể tạo ra một phương pháp void trong giao diện Component của bạn mà lấy một đối tượng, và nó sẽ thực hiện tiêm thành viên khi nó. Điều đó sẽ đơn giản hơn nhiều so với mã nguồn được cung cấp ở đây, nhưng có chức năng giống nhau. Đây là tài liệu liên quan: https://google.github.io/dagger/api/2.0/dagger/Component.html –

0

Mặc dù tôi không hài lòng với điều này vì tôi phải viết mã boilerplate, một cái gì đó như thế này làm việc với servlet.

public class MyServlet extends HttpServlet { 

    @Inject 
    MyService service; 

    @Override 
    public void init(ServletConfig config) throws ServletException { 
    super.init(config); 
    this.service = MyDaggerComponent.create().injectMyService(); 
    } 
} 

Bạn có thể xem xét việc thiết instance MyDaggerComponent vào ServletContext và sau đó nhận được nó như thế này trong init() phương pháp:

((MyDaggerComponent)config.getServletContext().getAttribute("MyDaggerComponent")).injectMyService() 
Các vấn đề liên quan