首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不使用匕首获得单身者

不使用匕首获得单身者
EN

Stack Overflow用户
提问于 2015-03-22 13:28:10
回答 1查看 307关注 0票数 0

在我目前的Android应用程序中,我刚刚开始使用Dagger,我不知道如何实现我想要的功能(我相信我想要的功能是可能的)。

基本上,我的处境是这样。我有以下类,我希望它们的实例/注射由Dagger管理。我还希望其中一些是单身汉,这一点在(1)中得到了注意:

  • CipherFactory -简单,包装-私人工厂
  • CryptoService (1) -依赖于CipherFactory
  • SerializationService (1) -依赖于杰克逊的ObjectMapper
  • PlayerApplicationService (1) -依赖于SerializationService
  • PlayerRepository (1) -依赖于SerializationService,CryptoService

现在,我可以让Dagger创建这些服务,并适当地注入它们的依赖关系;问题是,有些类依赖于多个类,而且每次注入日志语句时,它都会出现在日志语句中。

下面是我目前对上述内容的了解,包括Dagger模块类:

CryptoService.java

代码语言:javascript
复制
@Singleton
public class CryptoService {
    private final CipherFactory cipherFactory;

    @Inject
    CryptoService(CipherFactory cipherFactory) {
        this.cipherFactory = cipherFactory;
    }
    ...
}   

CryptoServiceModule.java

代码语言:javascript
复制
@Module(
        injects = CryptoService.class,
        complete = true,
        library = true
)
public class CryptoServiceModule {

    @Provides
    @Singleton
    CipherFactory provideCipher() {
        return new CipherFactory();
    }

}

SerializationService.java

代码语言:javascript
复制
@Singleton
public class SerializationService {

    private final ObjectMapper objectMapper;

    @Inject
    SerializationService(ObjectMapper objectMapper) {
        this.objectMapper = objectMapper;
    }
    ...
}

SerializationServiceModule.java

代码语言:javascript
复制
@Module(
        injects = SerializationService.class,
        library = true,
        complete = true
)
public class SerializationServiceModule {

    @Provides
    @Singleton
    ObjectMapper provideMapper() {
        return new ObjectMapper();
    }

}

PlayerApplicationService.java

代码语言:javascript
复制
public class PlayerApplicationService {

    private SerializationService serializationService;

    @Inject
    public PlayerApplicationService(SerializationService serializationService) {
        this.serializationService = serializationService;
    }
    ....
}

PlayerApplicationServiceModule.java

代码语言:javascript
复制
@Module(
        injects = PlayerApplicationService.class,
        includes = {
                SerializationServiceModule.class
        },
        complete = true,
        library = true
)
public class PlayerApplicationServiceModule {
}

PlayerRepository.java

代码语言:javascript
复制
@Singleton
public class PlayerRepository implements Repository<Player> {

    private final SerializationService serializationService;
    private final CryptoService cryptoService;

    @Inject
    public PlayerRepository(SerializationService serializationService, CryptoService cryptoService) {
        this.serializationService = serializationService;
        this.cryptoService = cryptoService;
    }
    ...
}

PlayerRepositoryModule.java

代码语言:javascript
复制
@Module(
        injects = PlayerRepository.class,
        includes = {
                SerializationServiceModule.class,
                CryptoServiceModule.class
        },
        complete = true,
        library = true
)
public class PlayerRepositoryModule {
}

我遗漏了什么?正如我前面提到的,所有这些东西都是这样工作的,看起来我只是得到了一些依赖项的多个实例(例如,SerializationService,由两个类使用),我只需要/只需要一个。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-02 15:31:30

基于@Andyccs的注释,我将所有内容合并到应用程序级别的Module类中,并删除应用程序中的所有其他模块类:

PlayerApplicationModule.java

代码语言:javascript
复制
@Module(
        injects = {
                PlayerApplication.class,
                CryptoService.class,
                SerializationService.class,
                PlayerApplicationService.class
        },
        complete = true,
        library = true
)
public class PlayerApplicationModule {
    private PlayerApplication application;

    public PlayerApplicationModule(PlayerApplication application) {
        this.application = application;
    }

    @Provides
    @Singleton
    public Context provideApplicationContext() {
        return application;
    }

    @Provides
    @Singleton
    public CipherFactory provideCipherFactory() {
        return new CipherFactory();
    }

    @Provides
    @Singleton
    public ObjectMapper provideObjectMapper() {
        return new ObjectMapper();
    }

}

现在一切都如期而至。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29194945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档