Как использовать кинжал в проекте библиотеки Android

В настоящее время я пытаюсь добавить Кинжал в мои проекты Android. Для проектов приложений это легко и понятно для меня, как создать ObjectGraph. Но я не совсем понимаю, что это лучший способ сделать это в моих проектах библиотеки Android.

Должен ли я продолжать создавать ObjectGraph в классе приложений приложений и передавать OG на LibraryModule – plinging OG библиотеки в OG Apps? Или я должен построить весь ObjectGraph в библиотеке?

Что делать, если мне нужно ввести класс в библиотеку ObjectGraph.inject(this) ? В моих проектах приложений я могу получить OG из класса Application. Но как справиться с этим в библиотеке? Должен ли я добавить метод @Provides для ObjectGraph?

Большое спасибо за вашу помощь.

Редактировать: Короче: Как я могу вызвать ObjectGraph.inject(this) в моем проекте библиотеки, где у меня нет доступа к OG, потому что он строится в классе приложений?

Solutions Collecting From Web of "Как использовать кинжал в проекте библиотеки Android"

В случае, если кто-то использует Dagger 2, вот что я сделал в своем приложении:

В библиотечном модуле я создал следующий модуль и компонент:

 @Module public class ModuleUtil { @Provides public RestTemplate provideRestTemplate() { return new RestTemplate(); } } @Singleton @Component( modules = { ModuleUtil.class }) public interface MainComponent { void inject(Postman postman); } 

И затем я создал Синглтон ниже, чтобы управлять инъекциями:

 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(); } } 

Когда некоторый класс из библиотечного модуля должен вводить свои члены, я просто вызываю DaggerWrapper.getComponent().inject(this); И это не так.

Я делаю так:

  1. Классы @Module относятся к основному проекту и предоставляют реализации, которые вы вводите в библиотечные элементы, поэтому в библиотечных проектах нет классов @Module

  2. Элементы библиотеки, ожидающие зависимости, должны иметь доступ к ObjectGraph и вызывать .inject () сами по себе, но основной проект должен предоставить экземпляр ObjectGraph для библиотеки с предоставленной зависимостью @Module

  3. Как получить ObjectGraph из основного проекта в библиотеку? У вас может быть такой интерфейс:

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

Контекстные объекты, такие как Activity или Application class, реализуют этот интерфейс (владельцы объектов ObjectGraph).

Если у вас есть пример Activity в библиотечном модуле, который нуждается в том, чтобы что-то вводить из основного проекта, это будет выглядеть так:

 class LibraryActivity extends Activity { @Inject ActivationModule instance; void onCreate(... ) { Injector injector = (Injector)getApplicationContext(); injector.inject(this) } } 

ActivationModule – это класс / интерфейс в проекте библиотеки.

Основной проект имеет класс приложений, который реализует интерфейс Injector и создает ObjectGraph с предоставленным dependecy для ActivationModule в проекте библиотеки.

 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 { .... } 

Если вы даете эту библиотеку людям, и они ничего не знают о вашем сценарии, поэтому вы должны написать это так, чтобы ваш кинжал отлично работал без какой-либо помощи пользователя. (Легче работать с лучшей практикой)

Я просто написал для вас некоторую библиотеку, чтобы показать, как это сделать. Я написал библиотеку таким образом, что вы даже можете запустить ее отдельно и увидеть результат на вкладке сообщений. Пользователь вашей библиотеки не должен ничего знать о кинжале и ничего не делает, он просто использует библиотеку, и кинжал будет настроен:

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

Если эта библиотека – это то, что вы используете ее самостоятельно и для собственного проекта, лучшая практика – это сделать это в этом проекте моего друга:

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

На все ваши вопросы отвечают в этих двух проектах. Спросите любой вопрос и больной ответ в комментарии.

Вот полный пример использования кинжала в приложении. Шаг 1. Добавьте depedancy к уровню уровня градиента уровня проекта. Com.neenbedankt.gradle.plugins: android-apt: 1.8 'Шаг 2 Уровень депиантности уровня

Применить плагин: «com.android.application» применить плагин: «android-apt» применить плагин: «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' 

Шаг 3 Постройте кинжал со своим классом приложений

Открытый класс TubeMateApp расширяет приложение {

 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; } 

} Шаг 4 Создайте AppModule, как это

@Module открытый класс AppModule {

 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); } 

} Шаг 5 Создайте компоненты приложения, которые должны быть добавлены в компоненты приложения для кинжалов. Шаг 6 Используйте кинжал в основной активности всплеска, как применять кинжал, см. Этот скриншот