2016-09-05 22 views
19

Tôi chưa tìm được lời giải thích hay ví dụ về phương pháp tiêm bằng Dagger 2. Ai đó có thể giúp tôi hiểu không?Phương pháp tiêm sử dụng Dagger 2

Ví dụ:

@Inject 
public Dinner makeDinner(Pasta pasta, Sauce sauce) { 
    mPan.add(pasta); 
    mPan.add(sauce); 
    return mPan.cookDinner(); 
} 

Vì vậy, nếu tôi chú thích phương pháp của tôi với @Inject, tôi sửa để giả định rằng các đối số trong phương pháp chữ ký sẽ được tiêm với các đối tượng được xác định từ đồ thị đối tượng? Làm thế nào tôi có thể sử dụng phương pháp này trong mã của tôi sau đó? Nó vẫn sẽ mong đợi tôi cung cấp tất cả các đối số, khi tôi thực hiện cuộc gọi phương thức, loại đánh bại mục đích đó.

UPDATE:

Vì vậy, từ những gì tôi hiểu được đối tượng Dinner sẽ có mặt nếu tôi gọi DinnerComponent.dinner(), giả sử DinnerComponent của tôi được thiết lập như thế này:

@Component(modules = DinnerModule.class) 
public interface DinnerComponent { 
    Dinner dinner(); 
} 

và DinnerModule của tôi được thiết lập như thế này:

@Module 
public class DinnerModule { 
    public DinnerModule() {} 

    @Provides 
    Pasta providePasta() { return new Pasta(); } 

    @Provides 
    Sauce provideSauce() { return new Sauce(); } 
} 

Điều gì xảy ra nếu tôi muốn bữa tối của mình được chiên? Vì vậy, hãy giới thiệu phương pháp này:

@Inject 
public Dinner makeDinner(Pasta pasta, Sauce sauce) { 
    mPan.add(pasta); 
    mPan.add(sauce); 
    return mPan.fryDinner(); 
} 

Làm thế nào tôi có thể xác định trong thành phần mà bữa ăn tối là đó?

+0

Tôi không chắc bạn đã lấy ví dụ này ở đâu, nhưng nhìn vào nó tôi nghĩ bạn có thể muốn đọc về tiêm hỗ trợ. –

+0

Bạn có thể đã sử dụng chú thích @Named. –

Trả lời

22

Một khác biệt cơ bản về phương pháp tiêm khác với cách mà bạn đang sử dụng nó là method injection is just another way for Dagger to send in dependencies khi xây dựng hoặc tiêm một DI-ready đối tượng, có nghĩa là @ Tiêm-chú thích phương pháp có nghĩa là để được gọi là bởi Dagger một lần về xây dựng và không phải từ bên trong mã của riêng bạn. Điều này làm cho nó rất không chắc rằng bạn sẽ @Inject -annotate makeDinner, fryDinner hoặc bất kỳ phương pháp nào khác có tác dụng phụ có ý nghĩa hoặc giá trị trả về. Thay vào đó, hãy xử lý phương pháp tiêm như một cơ hội sau khi thực tế cho việc xây dựng kiểu phun.

public class Chef { 
    private Provider<Pasta> mPastaProvider; 
    private Sauce mSauce; 

    @Inject 
    public void registerIngredients( // can be named anything 
     Provider<Pasta> pastaProvider, 
     Sauce sauce) {     // T and Provider<T> both work, of course 
    mPastaProvider = pastaProvider; 
    mSauce = sauce; 
    } 

    /* [email protected] */ public Dinner cookDinner() { 
    mPan.add(mPastaProvider.get()); 
    mPan.add(mSauce); 
    return mPan.cookDinner(); 
    } 

    /* [email protected] */ public Dinner fryDinner() { 
    mPan.add(mPastaProvider.get()); 
    mPan.add(mSauce); 
    return mPan.fryDinner(); 
    } 
} 

Trong trường hợp này, khi bạn yêu cầu tiêm trên đầu bếp, Dagger sẽ thấy phương pháp @ Inject-annotated và gọi nó. Trừ khi bạn có một hàm tạo @-chú thích được chú giải hoặc phương thức @Provides, bạn sẽ không thể lấy Chef trực tiếp từ Component của bạn, nhưng bạn có thể tạo một phương thức void trên Component nhận một cá thể Chef được xây dựng và sử dụng lĩnh vực và phương pháp tiêm để cung cấp cho rằng đầu bếp với các thành phần (hoặc thành phần nhà cung cấp) họ có thể cần. (Xem các tài liệu @ComponentMembersInjector để biết chi tiết.)

Lưu ý rằng không có trường hợp nào Dinner xuất hiện trên biểu đồ đối tượng!Việc thêm @Inject vào một hàm tạo cho Dagger biết rằng nó có thể sử dụng hàm tạo đó để làm cho đối tượng có sẵn trên đồ thị đối tượng, nhưng thêm @Inject vào một phương thức hoặc trường chỉ cho Dagger biết rằng là một phần của quá trình tiêm nó nên điền vào trường đó hoặc gọi phương pháp đó với các phụ thuộc nhất định. Nếu bạn muốn tạo một Bữa tối có sẵn trên biểu đồ đối tượng, bạn sẽ cần phải @ Inject-chú thích hàm dựng Tối, hoặc đặt một phương thức @Provides hoặc @Binds trên Mô-đun mà bạn nạp vào Thành phần.

Tại sao bạn sử dụng tính năng này? Xem xét trường hợp đối tượng được tạo một cách phản ánh (ví dụ: Hoạt động, Phân đoạn và Chế độ xem trong Android hoặc đối tượng có thể tuần tự), nơi bạn không muốn để lộ các trường @Inject. Trong những trường hợp đó, bạn có thể làm việc xung quanh các ràng buộc của hàm tạo bằng cách tiêm của bạn xảy ra trên một trường. Tương tự, mặc dù tôi đã không thử điều này, bạn có thể tận dụng phân cấp lớp để đánh dấu một phương thức giao diện với @Inject, đảm bảo rằng bạn có đang ở trong ngữ cảnh DI hay không, bạn có thể chuyển một số phụ thuộc nhất định cho một đối tượng như một phần của chúng chuẩn bị.

+2

Sau khi đọc câu trả lời này nhiều lần, và thử nó cho bản thân mình, tôi nghĩ rằng tôi cuối cùng đã lên đến tốc độ trên phương pháp tiêm. Cảm ơn! – Vas

5

Chú thích phương thức với @Inject cung cấp cho hướng dẫn Dagger để thực thi phương pháp này ngay sau khi tạo đối tượng - ngay sau khi gọi hàm tạo. Điều này rất hữu ích khi bạn cần một đối tượng được xây dựng đầy đủ cho một cái gì đó. Có một ví dụ về phương pháp tiêm trong this article.

Bạn nói đúng rằng thông số của phương pháp này sẽ được cung cấp bởi Dagger, đó là lý do tại sao bạn không phải tự gọi phương thức này.

+0

OK, hãy để tôi cập nhật câu hỏi của tôi sau đó. – Vas

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