Как достичь синглтона области видимости с помощью аннотаций зубочистки?

#kotlin #toothpick-di

Вопрос:

У меня есть приложение не для Android, в котором много похожих объектов осколков, и я хочу, чтобы все объекты внутри каждого осколка (клиент БД, DAOs…) были одиночными.

Для этой цели я создал аннотацию ShardSingleton:

 @Scope
@Retention(AnnotationRetention.RUNTIME)
annotation class ShardSingleton
 

и я создаю каждый объект-осколок в его собственной области:

     var shard1: Shard = KTP.openScopes("app", "shard1")
        .supportScopeAnnotation(ShardSingleton::class.java)
        .getInstance(Shard::class.java)

 

Чтобы мой DAO действительно был одиночным элементом внутри своего осколка, я должен аннотировать его обоими @ShardSingleton и @Singleton :

 @Singleton // the FooDAO is not a singleton without this annotation
@ShardSingleton
@InjectConstructor
class FooDAO(val dbClient: DBClient)
 

На первый взгляд (и, вероятно, по незнанию) я подумал @ShardSingleton , что этого было бы достаточно.

Ожидается ли это?

Вот суть, демонстрирующая поведение: https://gist.github.com/bfreuden/a866b21c5a6342a3ce1ed26aa636f9f6