Вот моя проблема:
Во-первых, важно знать, что я пишу симуляцию. Это отдельное приложение с однопоточным-потоком. У меня есть по существу два класса объектов, которые имеют разные требования к области видимости.
Классы, которые следует использовать как синглтоны на протяжении всей симуляции. Например, экземпляр Random.
Группы классов, которые создаются вместе, и внутри группы каждый экземпляр следует рассматривать как синглтон. Например, скажем, RootObject
является классом верхнего уровня и имеет зависимость от ClassA
и ClassB
, оба из которых имеют зависимость от ClassD
. Для любого заданного RootObject
обе его зависимости(ClassA
иClassB
)должны зависеть от одного и того же экземпляра ClassD
. Однако экземпляры ClassD
не должны использоваться в разных экземплярах RootObject
.
Надеюсь, это имеет смысл. Я могу придумать два подхода к этому. Один из них — пометить все внедренные объекты как синглтоны, создать корневой инжектор и выделить дочерний инжектор каждый раз, когда мне нужно создать новый экземпляр RootObject
. Затем экземпляры RootObject
и все его зависимости создаются как синглтоны, но эта информация об области видимости отбрасывается при следующем создании другого RootObject
.
Второй подход заключается в реализации некоторого типа пользовательской области действия.
Документация Guice дает противоречивые советы... С одной стороны, там говорится, что у вас должен быть один инжектор, и что в идеале он вызывается один раз для создания класса верхнего уровня. С другой стороны, он говорит держаться подальше от пользовательских областей.