工厂方法辅助注入

问题描述 投票:0回答:1

我有一个工厂方法:

 public static myDataService(DataFetcher dataFetcher, Config config)

我想用它建造一个辅助工厂

@AssistedFactory
public interface MyDataServiceFactory {
  MyDataService create(Config config);
}

可能吗?如果没有,是否有可行的解决方法(我的目标是减少样板文件)

dagger-2 assisted-inject
1个回答
0
投票

@AssistedFactory
注释通常与 Dagger(依赖注入框架)一起使用来创建类的实例,其中一些依赖项是在运行时而不是编译时提供的。它适用于您有一个需要动态提供一些依赖项的工厂方法的场景。

给定您的工厂方法:

public static MyDataService myDataService(DataFetcher dataFetcher, Config config)

如果您想为此方法创建一个辅助工厂,其中注入

DataFetcher
并在运行时提供
Config
,您将按照以下步骤操作:

  1. 定义辅助工厂接口:

    为您的工厂定义一个接口,使用

    @Assisted
    指示要在运行时提供哪些参数。

    import dagger.assisted.Assisted;
    import dagger.assisted.AssistedFactory;
    
    @AssistedFactory
    public interface MyDataServiceFactory {
      MyDataService create(@Assisted Config config);
    }
    
  2. 修改

    MyDataService
    类:

    您的

    MyDataService
    课程需要调整以适应辅助注射。这通常涉及使用 Dagger 的
    @Inject
    注释来处理
    DataFetcher
    依赖项,以及使用构造函数或方法来处理辅助参数。

    import javax.inject.Inject;
    
    public class MyDataService {
    
      private final DataFetcher dataFetcher;
      private final Config config;
    
      @Inject
      public MyDataService(DataFetcher dataFetcher, @Assisted Config config) {
        this.dataFetcher = dataFetcher;
        this.config = config;
      }
    }
    
  3. 创建匕首模块:

    您需要创建一个 Dagger 模块来提供

    DataFetcher
    并定义辅助注入机制。

    import dagger.Module;
    import dagger.Provides;
    import dagger.assisted.AssistedInject;
    import dagger.assisted.AssistedFactory;
    import dagger.assisted.Assisted;
    
    @Module
    public class MyDataServiceModule {
    
      @Provides
      DataFetcher provideDataFetcher() {
        return new DataFetcher();
      }
    
      @Provides
      @AssistedFactory
      MyDataServiceFactory provideMyDataServiceFactory(DataFetcher dataFetcher) {
        return new MyDataServiceFactoryImpl(dataFetcher);
      }
    }
    

    注意,

    MyDataServiceFactoryImpl
    是由Dagger生成的,不需要你手动实现。

  4. 使用工厂:

    完成所有设置后,您现在可以使用

    MyDataServiceFactory
    使用运行时提供的配置创建
    MyDataService
    的实例。

    @Inject
    MyDataServiceFactory myDataServiceFactory;
    
    public void someMethod() {
      Config config = new Config();
      MyDataService service = myDataServiceFactory.create(config);
    }
    

解决方法和注意事项

  • 构造函数注入和构建器模式:如果无法使用辅助注入或者您不想使用 Dagger,请考虑使用构建器模式来减少样板代码。这种模式可以帮助管理复杂的构造逻辑。

  • 带有依赖注入的工厂方法:如果您不依赖于使用 Dagger,另一种方法可能是使用带有依赖注入的传统工厂方法。您可以手动管理依赖项或使用其他 DI 框架。

  • 代码生成工具:如果 Dagger 的辅助注入不适合您的用例,探索其他代码生成工具可能有助于减少样板代码。

总而言之,要将辅助工厂与 Dagger 一起使用,您需要调整

MyDataService
以使用辅助注入,定义辅助工厂接口,并设置 Dagger 模块。这种方法减少了样板文件,同时利用 Dagger 强大的依赖注入功能。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.