当前位置: 首页 > 知识库问答 >
问题:

如何用Dagger为构造函数注入提供自定义依赖关系

谭敏学
2023-03-14

我有我的NetworkDataSource,我想注入它。我想使用构造函数注入,因为我是这个类的所有者:

 public class NetworkDataSource {

    @Inject
    public NetworkDataSource(String url, String method) {
        this.url = url;
        this.method = method;
    }
 }

问题是,当触发BroadcastIntent时,该构造函数的参数(即依赖项)将作为附加项从服务中检索。所以我的问题是,如何将从服务检索的这些参数提供给我的NetworkDataSource构造函数注入?

public class Service extends IntentService {

   // I would like to inject NetworkDataSource
   //@Inject
   //NetworkDataSource netWorkDataSource;

   public String url;
   public String method;

   @Override
   protected void onHandleIntent(Intent workIntent) {
     url = workIntent.getStringExtra("url");
     method = workIntent.getStringExtra("method");
   }

   ............
   ............

   networkDataSource.myMethod();
}

谢谢你。

共有1个答案

郤望
2023-03-14

这是一个棘手的问题,因为您可能认为Dagger主要解决了现在不再需要引入“工厂”类来重新配置行为的问题。

但是,实际上仍然需要使用“工厂”类来创建具有在运行时获得的动态构造函数参数的对象。

所以:

 public class NetworkDataSource {

    @Inject
    public NetworkDataSource(String url, String method) {
        this.url = url;
        this.method = method;
    }
 }
@Singleton
public class NetworkDataSourceFactory {
    private final OkHttpClient okHttpClient;
    private final Gson gson;

    @Inject
    public NetworkDataSourceFactory(OkHttpClient okHttpClient, Gson gson) {
        this.okHttpClient = okHttpClient;
        this.gson = gson;
    }

    public NetworkDataSource create(String url, String method) {
        return new NetworkDataSource(okHttpClient, gson, url, method);
    }
}
@Inject NetworkDataSourceFactory factory;

....
    networkDataSource = factory.create(url, method);

编辑:您也可以查看https://github.com/square/assistedinject以帮助解决此问题。

 类似资料:
  • 好的,到目前为止还好。但是等等,突然A需要额外的输入,比如一个对它的构造至关重要的名为“amount”的整数。现在,我的A构造函数需要如下所示: 突然这个新参数干扰了注射。此外,即使这确实有效,我也无法在从提供者检索新实例时输入“金额”,除非我弄错了。这里有几件事我可以做,我的问题是哪一件是最好的? 我可以通过添加一个方法来重构A,该方法应该在构造函数之后调用。然而,这是很难看的,因为它迫使我推迟

  • 我正试图在计算机上实现这个例子https://developer.android.com/jetpack/docs/guide.这就解释了Android应用程序的结构。 当我使用相同的代码时,我会出现以下错误。 我可以找出这个错误与 当我为ViewModel编写默认的零输入构造函数时,我得到了以下错误。 我想不出这个错误的原因和解决方法。

  • 我正试图在我的Android项目中使用Dagger2。首先,我想使用两个组件分别负责注入应用程序范围和活动范围的依赖关系。作为一个基本的参考,我使用了这个答案。 因此,有两种不同的方法来设置组件之间的关系:使用注释和使用参数。 如果使用第一个组件,我的工作正常。但是,当我尝试从注入依赖项时,就会出现以下构建时错误: 错误:com。实例用户界面。活动如果没有@Inject构造函数或@Provides

  • 基本上,我的Android库项目中有一个名为的单例类。在项目中,我有一个名为的类,它是一个Dagger2模块,它提供了我的单例,如下所示。 现在,在我的实际应用程序中,我有以下组件。 因此这用于将注入到类中。它是这样做的。

  • 我有一个通用服务,它使用一个配置来进行它的处理。 我想在我的控制器的操作中注入那个服务。但每个操作都有特定的配置。 我如何使用? 有没有配置控制器操作的方法? 比如这样: 我可以在MyCustomService中使用一个config方法,并在每个控制器的操作中调用它。但没那么优雅。

  • 我需要重构现有的抽象类来实现依赖注入,但是这个类有两个接受其他参数的构造函数。 我需要注入一些接口,并避免在构造函数中传递任何其他参数,如“settingsId”和“Setting”。所以我的想法是在创建此类的实例后创建两种方法来设置这些参数。 但它看起来不是一个合适的解决方案,因为如果开发人员忘记在创建实例后运行这些方法之一,我们将来可能会得到一个异常(对象未设置为引用...)。我应该如何正确执