gpt4 book ai didi

java - 类初始化后使用 Dagger 2 解决命名依赖关系

转载 作者:太空宇宙 更新时间:2023-11-04 12:40:03 26 4
gpt4 key购买 nike

我正在使用 Dagger 2 来管理我的 Java 应用程序的依赖关系。

我有以下结构:

public interface SecondaryService 
{
void doSomethingElse(String data);
}

public class SecondaryServiceFirstImpl implements SecondaryService
{
public void doSomethingElse(String data)
{
// Do something else
}
}

public class SecondaryServiceSecondImpl implements SecondaryService
{
public void doSomethingElse(String data)
{
// Do something else
}
}

public interface MainInterface
{
void doSomething(String data);
}

public class MainService implements MainInterface
{
private SecondaryService secondaryService;
private DatabaseService databaseService;
public MainService(SecondaryService secondaryService, DatabaseService databaseService)
{
this.secondaryService = secondaryService;
this.databaseService = databaseService;
}

public void doSomething(String data)
{
String name = databaseService.getName(data);

// Resolve the NAMED SecondaryService based on the name property and
// use the implementation.
}
}

这是 Dagger 模块代码:

@Module
public class DependencyRegisterModule
{
@Provides @Named('first')
SecondaryService provideSecondaryServiceFirstImpl ()
{
return new SecondaryServiceFirstImpl ();
}

@Provides @Named('second')
SecondaryService provideSecondaryServiceSecondImpl ()
{
return new SecondaryServiceSecondImpl ();
}

@Provides
DatabaseService provideDatabaseService ()
{
return new DatabaseServiceImpl();
}

@Provides
MainInterface provideMainInterface(SecondaryService secondaryService, DatabaseService databaseService)
{
return new MainService (secondaryService, );
}
}

如您所见,我有一个由两个类实现的 SecondaryService 接口(interface)。我想根据从 MainService 中的方法内的数据库获取的参数来解析 SecondaryService 的命名依赖项。

有办法做到这一点吗?如果这不适用于 Named 依赖项,是否有其他方法可以做到这一点?

到目前为止,我已经使用了工厂模式,但它很难管理,因为我必须在其构造函数中传递类的依赖关系。

最佳答案

@Named(或一般情况下的 @Qualifiers)适用于需要 2 个同类对象的情况,例如注入(inject)字符串用户名字符串电子邮件。在这种情况下,可以使用限定符来区分这些对象。

就您的情况而言,您似乎想要一个对象另一个。在您的情况下,如果您想采取干净的方法,则应该使用不同的模块,或者在构造函数中向模块添加 if/else。

使用基类

@Module
public abstract class ServiceModule {
@Provides
public abstract SecondaryService providesServcie();
}

然后只需创建该模块的2个子类并分别提供所需的服务即可。

创建组件时只需提供模块的正确实现

if(1 == 1)
new MyComponent.Builder().add(new OneServiceModule()).build();
else
new MyComponent.Builder().add(new OtherServiceModule()).build();

请记住,您不必重复其他 @Provides 方法,因为您可以在组件中使用多个模块。

使用 if/else 结构

@Module
public class DependencyRegisterModule
{
private int whichModule;

public DependencyRegisterModule(int whichModule) {
this.whichModule = whichModule;
}

@Provides
SecondaryService provideSecondaryServiceSecondImpl ()
{
return whichModule == 1 ? new SecondaryServiceSecondImpl() : new SecondaryServiceFirstImpl();
}
}

我希望我不必解释 if/else 是如何工作的;)

关于java - 类初始化后使用 Dagger 2 解决命名依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36915455/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com