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