Tag: 依赖注入

Kotlin是否需要DI框架?

寻找依赖注入(DI)的需要,我很清楚并不是所有的语言都使用DI框架。 例如,关于Ruby的一个特别的文章( 关于DI框架的Ruby Talk )讨论了DI,以及由于语言的灵活性和意图,Ruby如何不需要DI框架。 它举例说明,而不是注入一些东西,我们可以只添加一个默认参数,例如: class FooBar(val foo: FooInterface = Foo()) 这样,如果我们需要FooInterface另一个实例,我们只需要用别的东西来实例化FooBar类。 我认为Kotlin提供了同样的灵活性,所以我的问题是,当我们在项目中完全不使用Java时,是否真的需要DI框架?

如果没有kotlin中的@ Provide-或@ Produces注解方法,则不能提供上下文

我在Kotlin使用Dagger进行依赖注入。 现在这里是必要的类 ActivityModule @Module class ActivityModule (val activity : Activity){ @Provides @ActivityContext fun provideContext() : Context{ return activity } } ActivityComponent @PerActivity @Component(dependencies = arrayOf(ApplicationComponent::class), modules = arrayOf(ActivityModule::class)) interface ActivityComponent { fun inject(activity: MainActivity) } 主要活动 @Inject @ActivityContext lateinit var context:Context override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) DaggerActivityComponent.builder() .applicationComponent(MainApplication.getInstance().getApplicationComponent()).activityModule(ActivityModule(this)).build() .inject(this); 现在我收到以下错误 error: android.content.Context cannot be […]

正确的方法来注入匕首2 + Kotlin + ViewModel

class SlideshowViewModel : ViewModel(){ @Inject lateinit var mediaItemRepository : MediaItemRepository fun init() { What goes here? } 所以我想学习Dagger2,这样我可以让我的应用程序更易于测试。 问题是,我已经集成了Kotlin,并且正在开发Android架构组件。 我明白,构造函数注入是可取的,但这是ViewModel不可能的。 相反,我可以使用lateinit为了注入,但我不知道如何注入。 我是否需要为SlideshowViewModel创建一个组件,然后注入它? 还是我使用应用程序组件? gradle这个: apply plugin: 'com.android.application' apply plugin: 'kotlin-android' kapt { generateStubs = true } dependencies { compile "com.google.dagger:dagger:2.8" annotationProcessor "com.google.dagger:dagger-compiler:2.8" provided 'javax.annotation:jsr250-api:1.0' compile 'javax.inject:javax.inject:1' 应用组件 @ApplicationScope @Component (modules = PersistenceModule.class) public interface ApplicationComponent […]

Dagger2 + MVP上Kotlin

我正在学习Dagger2 + MVP并在Kotlin上做。 而且我在理解Dagger2或者MVP或者那里有一个问题。 构建一个应用程序和想法应该如何工作是非常简单的。 该应用程序由左侧导航MenuActivity和几个Fragments (比方说3),应该在activity_menu.xml的FrameLayout中进行更改。 我已经读了几篇文章,花了几天时间学习Dagger2。 本文我作为教程来构建我的示例: https : //proandroiddev.com/dagger-2-part-ii-custom-scopes-component-dependencies-subcomponents-697c1fa1cfc 在我的想法中,Dagger架构应该由三个@Component组成:(1)AppComponent,(2)MenuActivityComponent和(3)AccountFragmentComponent。 从我的理解和文章中的建筑图片我的架构可以是这样的:(3)取决于 – >(2)取决于 – >(1) 每个@Component具有@Module :(1)AppModule,(2)MenuActivityModule和(3)AccountFragmentModule。 (2)MenuActivityModule和(3)AccountFragmentModule应该@Provide Presenter从MVP意识形态的Presenter是@Inject在MenuActivity和其他Fragment ,如AccountFragment 。 的AppModule @Module class AppModule(val app : App){ @Provides @Singleton fun provideApp() = app } AppComponent @Singleton @Component(modules = arrayOf(AppModule::class)) interface AppComponent{ fun inject(app : App) fun plus(menuActivityModule: MenuActivityModule): MenuActivityComponent } MenuActivityModule […]

Kotlin:在命令行中运行kapt来为DI生成存根

我试图从命令行运行kapt3为Kotlin文件生成Java存根。 语法似乎是: kotlinc -P plugin:org.jetbrains.kotlin.kapt3:aptMode=stubs -classpath $CLASSPATH:$ANDROID_HOME/platforms/android-23/android.jar -d $OUT $SRCS 它是否正确? 我没有看到kotlin/lib文件夹中的插件。 目前我正试图从源代码构建它,但下载它的“官方”方式是什么? 补充笔记: 这是一个Android项目,因此包含了android.jar 我的用例:该项目正在编译与BUCK 。 不是gradle 。 Buck现在还不支持kapt ,而且我需要为DI(依赖注入)生成存根,以在kotlin代码上正常工作。

如何在Kotlin中注入原始变量?

我在我的Android应用程序中使用Dagger2作为DI,并使用此代码注入类到我的活动罚款: @field:[Inject ApplicationContext] lateinit var context: Context 但是,在Kotlin的基本类型属性(例如Boolean )中不允许使用lateinit修饰符,我该如何做这样的事情? @field:[Inject Named("isDemo")] lateinit var isDemo: Boolean 当我从这个代码删除lateinit我得到这个错误Dagger does not support injection into private fields

Kotlin春天类方面的启动

我正在尝试在java8的spring项目中使用kotlin。 我通过逐个替换类(java-> kotlin)来做到这一点。 我在Finder的一门课: Finder.java具有这样的结构: @Compoment class Finder { private SomeObject someObject; Finder() { someObject = new SomeObject(); } public void doSomething() { //aspect looks here someObject.do(); } } 我用Finder.kt取代了它 @Compoment open public class Finder { private val someObject : SomeObject constructor() { someObject = SomeObject() } public fun doSomething() { //aspect looks here someObject.do() […]

使用Guice + Kotlin绑定对象列表

我正在使用以下控制器定义在Kotlin中编写JavaFX应用程序: class MainController { @Inject private lateinit var componentDescriptors: List<ComponentDescriptor> /* More code goes here */ } 我正在使用Guice进行依赖管理。 我试图注入通过java.util.ServiceLoader加载的类实例的列表。 我的问题是定义一个绑定,将注入加载的对象实例列表到声明的字段。 我尝试基于注释的供应: internal class MyModule: AbstractModule() { override fun configure() { } @Provides @Singleton fun bindComponentDescriptors(): List<ComponentDescriptor> = ServiceLoader.load(ComponentDescriptor::class.java).toList() } 和多重绑定扩展(在Corse的字段定义中切换列表设置): internal class MyModule: AbstractModule() { override fun configure() { val componentDescriptorBinder = Multibinder.newSetBinder(binder(), ComponentDescriptor::class.java) ServiceLoader.load(ComponentDescriptor::class.java).forEach […]

如何使用Kotlin定向JavaScript的依赖注入?

我目前正在评估将大型Java / Swing应用程序移植到Kotlin。 该应用程序的领域是二维图形,图形,图形编辑和模拟/动画。 我想重写Kotlin中的整个应用程序核心,并将其转换为Java字节码以及JavaScript。 我目前能够编写Kotlin绘图代码,使用一些适配器和桥接类在Java窗口和HTML画布中呈现这些代码。 到现在为止还挺好。 现在我正在苦苦的依赖注入,我在我的应用程序中密切使用。 我想在我的Kotlin类中注入依赖项,并且仍然能够将它们转换为JVM和JavaScript,所以我寻找了Kotlin的DI框架。 我发现injekt和kodein ,但看起来他们都依赖于JDK类,所以它们不适用于我的JavaScript用例。 因此,我开始开发自己的纯Kotlin DI框架,直到我意识到JavaScript的Kotlin转换器还不支持反射,没有它,您不能进行依赖注入。 有谁知道JetBrains计划在不久的将来支持他们的JavaScript transpiler反射? 还是有人知道另一种编写使用依赖注入的纯Kotlin代码的方法,这仍然可以被转发到Java和JavaScript? 这个问题可能会成为我的项目的一个Kotlin展示,因为我不确定是否要回到静态可配置工厂。

Dagger2编译问题在kotlin

我正在尝试使用Dagger2学习依赖注入。 我创建了几个自定义范围和限定符。 我创建了一个应用程序组件,我想要注入某些全局依赖关系,并创建了一个基于活动上下文返回某些实例的Activity组件。 现在,当我尝试在活动中注入全局实例时,出现如下错误: e:/home/arifur/source_code/me/myprojects/Learn/studio/Android/kotlin/FirebaseChat/app/build/tmp/kapt3/stubs/debug/com/example/arifur/firebasechatkotlin/dependecies/component/ActivityComponent.java :7:error:com.google.firebase.auth.FirebaseAuth不能提供@ Provide或@ Produces注释的方法。 E: e:public abstract void inject(@ org.jetbrains.annotations.NotNull()e: ^ e:com.google.firebase.auth.FirebaseAuth在e: com.example.arifur.firebasechatkotlin.BaseActivity.firebaseAuth e: com.example.arifur.firebasechatkotlin.MainActivity在e: com.example.arifur.firebasechatkotlin.dependecies.component.ActivityComponent.inject(P0) w:警告:以下选项未被任何处理器识别:'[kapt.kotlin.generated]'w: e:/home/arifur/source_code/me/myprojects/Learn/studio/Android/kotlin/FirebaseChat/app/src/main/java/com/example/arifur/firebasechatkotlin/BaseActivity.kt:(29,9):Unresolved参考:DaggerActivityComponent e:/home/arifur/source_code/me/myprojects/Learn/studio/Android/kotlin/FirebaseChat/app/src/main/java/com/example/arifur/firebasechatkotlin/FirebaseChatApp.kt:(20,13 ):未解决的参考:DaggerFirebaseComponent e:/home/arifur/source_code/me/myprojects/Learn/studio/Android/kotlin/FirebaseChat/app/src/main/java/com/example/arifur/firebasechatkotlin/MainActivity.kt 🙁 1,1):处理注释时发生了一些错误。 请看上面的错误信息。 预选赛 ActivityContext.kt @Qualifier @Retention(AnnotationRetention.RUNTIME) annotation class ActivityContext ApplicationContext.kt @javax.inject.Qualifier @Retention(AnnotationRetention.RUNTIME) annotation class ApplicationContext 领域 ActivityScope.kt @Scope @Retention(AnnotationRetention.SOURCE) annotation class ApplicationScope ApplicationScope.kt @Scope @Retention(AnnotationRetention.SOURCE) annotation class ApplicationScope 组件 […]