2014-11-09 18 views
37

Tôi hiện đang cố gắng thêm Dagger vào dự án Android của mình. Đối với các dự án ứng dụng, nó dễ dàng và rõ ràng đối với tôi, cách xây dựng ObjectGraph. Nhưng tôi không biết whats cách tốt nhất để làm điều này trong các dự án thư viện Android của tôi.Cách sử dụng dao găm trong dự án thư viện android

Tôi có nên tiếp tục xây dựng ObjectGraph trong lớp Ứng dụng của ứng dụng và chuyển OG sang LibraryModule - thu thập OG của thư viện vào Apps OG không? Hoặc tôi nên xây dựng toàn bộ ObjectGraph trong thư viện?

Nếu tôi cần tiêm một lớp học trong thư viện bằng ObjectGraph.inject(this) thì sao? Trong các dự án Ứng dụng của tôi, tôi có thể nhận được OG từ lớp Ứng dụng. Nhưng làm thế nào để xử lý điều này trong thư viện? Tôi có nên thêm một phương thức @Provides cho ObjectGraph không?

Cảm ơn sự giúp đỡ của bạn.

Chỉnh sửa: Tóm lại: Làm thế nào tôi có thể gọi ObjectGraph.inject(this) trong dự án thư viện của mình nơi tôi không có quyền truy cập vào OG vì nó đang được xây dựng trong Lớp Ứng dụng?

+3

Tôi cũng có câu hỏi này ... Có ai thực sự biết cách thực hiện không? – mato

+0

@sebastian Bạn đã giải quyết được vấn đề của mình chưa? nếu có thì hãy đăng giải pháp của bạn .. – Sachin

+1

Tôi bị kẹt vì điều này trong Dagger 2 – conca

Trả lời

21

Trong trường hợp ai đó sử dụng Dagger 2 được ở đây, đây là cách tôi đã thực hiện trong App của tôi:

Trong module thư viện tôi đã tạo ra các mô-đun sau và Component:

@Module 
public class ModuleUtil { 

    @Provides 
    public RestTemplate provideRestTemplate() { 
     return new RestTemplate(); 
    } 

} 

@Singleton 
@Component(
     modules = { 
       ModuleUtil.class 
     }) 
public interface MainComponent { 
    void inject(Postman postman); 
} 

Và sau đó tôi đã tạo Singleton dưới đây để quản lý việc tiêm:

public class DaggerWrapper { 

    private static MainComponent mComponent; 

    public static MainComponent getComponent() { 
     if (mComponent == null) { 
      initComponent(); 
     } 
     return mComponent; 
    } 

    private static void initComponent() { 
     mComponent = DaggerMainComponent 
       .builder() 
       .utilModule(new ModuleUtil()) 
       .build(); 
    } 
} 

Khi một số cla ss từ các mô-đun thư viện cần tiêm các thành viên của nó, tôi chỉ cần gọi DaggerWrapper.getComponent().inject(this); và đó không phải là nó.

+0

Tôi hiểu DaggerWrapper cũng nằm trong mô-đun thư viện của bạn và nó có thể được truy cập từ mô-đun ứng dụng của bạn. Điều này có đúng không? –

+0

Điều này có vẻ là một câu trả lời tốt hơn bởi vì nó không yêu cầu bất cứ điều gì của ứng dụng (khách hàng của thư viện). –

+0

Nó có hoạt động không? Tiếp theo quá trình tương tự nhưng không hoạt động. Tôi nhận được "không thể tìm thấy biểu tượng lớp DaggerMainComponent" lỗi trong khi xây dựng các ứng dụng. –

10

tôi đang làm theo cách này:

  1. lớp @Module thuộc về dự án chính và họ cung cấp triển khai mà bạn đang tiêm vào các yếu tố thư viện, vì vậy không có lớp @Module trong dự án thư viện

  2. yếu tố Library mà đang mong đợi sự phụ thuộc phải có quyền truy cập vào ObjectGraph và gọi .inject() trên bản thân, nhưng dự án chính nên cung cấp cho ObjectGraph dụ đến thư viện với sự phụ thuộc @Module cung cấp

  3. Làm cách nào để đưa ObjectGraph từ dự án chính vào thư viện? Bạn có thể có giao diện như thế này:

    interface Injector { 
        void inject(Object object); 
        public ObjectGraph getObjectGraph(); 
    }

bối cảnh các đối tượng như Hoạt động hoặc lớp ứng dụng thực hiện giao diện này (người nắm giữ của các đối tượng ObjectGraph).

Nếu bạn có ví dụ về hoạt động trong các module thư viện mà cần một cái gì đó để tiêm từ dự án chính này sẽ trông như thế này:

class LibraryActivity extends Activity { 

    @Inject ActivationModule instance; 

    void onCreate(...) { 
     Injector injector = (Injector)getApplicationContext(); 
     injector.inject(this) 
    } 
} 

ActivationModule là lớp/giao diện trong dự án thư viện.

Dự án chính có lớp ứng dụng triển khai giao diện Injector và tạo ObjectGraph với sự phụ thuộc được cung cấp cho ActivationModule trong dự án thư viện.

class MyApplicationInTheMainProject extends Application implements Injector { 

    ObjectGraph graph; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     graph = ObjectGraph.create(new ActivationModuleImpl(this)); 
    } 

    @Override public void inject(Object object) { 
     graph.inject(object); 
    } 

    @Override public ObjectGraph getObjectGraph() { 
     return graph; 
    } 
} 


@Module(injects = { 
     LibraryActivity.class 
}, library = true) 
class ActivationModuleImpl implements ActivationModule { 
    .... 
} 
-3

Dưới đây là toàn bộ ví dụ làm thế nào để sử dụng dao găm với trong việc áp dụng Bước 1 Add depedancy dự án mức gradle classpath 'com.neenbedankt.gradle.plugins: android-apt: 1.8' Bước 2 Mô-đun mức depedancy

áp dụng plugin: 'com.android.application' áp dụng plugin: 'android-apt' áp dụng plugin: 'com.neenbedankt.android-apt'

compile 'com.google.dagger:dagger:2.0' 
provided 'com.google.dagger:dagger-compiler:2.0' 
provided 'org.glassfish:javax.annotation:10.0-b28' 

Bước 3 Build Dagger với lớp ứng dụng của bạn

public class TubeMateApp mở rộng ứng dụng {

public AppComponent component; 
public static TubeMateApp singleton; 


public static TubeMateApp getInstance() { 
    return singleton; 
} 

@Override 
public void onCreate() { 
    super.onCreate(); 
    singleton = this; 
    setupGraph(); 
} 

private void setupGraph() { 
    component = DaggerAppComponent.builder() 
      .appModule(new AppModule(this)) 
      .build(); 

    component.inject(this); 
} 


public AppComponent component() { 
    return component; 
} 

} Bước 4 Tạo AppModule như

@Module public class AppModule này {

private TubeMateApp app; 

public AppModule(TubeMateApp application) { 
    this.app = application; 
} 



@Provides 
public Application provideApplication() { 
    return app; 
} 

@Provides 
@Singleton 
Prefs prefs(){ 
    return Prefs.with(app); 
} 

// To use your custom requirement code here for example i have used Picasso with in the application 

@Provides 
@Singleton 
Picasso getPicasso(){ 
    return Picasso.with(app); 
} 

@Provides 
@Singleton 
LayoutInflater getLayoutInflater() { 
    return (LayoutInflater) app.getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 

} Bước 5 Tạo Linh Ứng dụng cần được tiêm dagger App Components here Bước 6 Sử dụng dao găm trong hoạt động giật gân chính how to apply dagger inject see this screenshot

+0

Dưới đây là ví dụ đầy đủ về cách sử dụng dao găm trong ứng dụng –

+0

Câu hỏi ban đầu là về cách sử dụng trong dự án thư viện android. –

2

nếu bạn đang đưa ra thư viện này với mọi người và họ không biết gì về kịch bản của bạn vì vậy bạn phải viết nó trong một cách mà Dagger của bạn hoạt động một cách hoàn hảo mà không cần bất cứ sự giúp đỡ từ người dùng. (dễ dàng hơn để làm việc với thực hành tốt hơn)

tôi vừa viết một số thư viện để bạn có thể hiển thị cách thực hiện. tôi đã viết thư viện theo cách mà bạn thậm chí có thể chạy nó độc lập và xem kết quả trong tab thông báo. người sử dụng thư viện của bạn doesnt cần phải biết gì về dao găm và không làm gì ông chỉ sử dụng thư viện và dao găm sẽ được cấu hình:

https://github.com/amirziaratii/libraryUsingDagger.git

nếu thư viện này là một cái gì đó bạn sử dụng nó cho mình và cho dự án của riêng bạn, Cách tốt nhất là làm điều đó như thế nào trong dự án này của bạn tôi:

https://github.com/mmirhoseini/trakt.tv

tất cả các câu hỏi của bạn được trả lời trong hai dự án này. hỏi bất kỳ câu hỏi và câu trả lời bị bệnh trong nhận xét.

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