Доброго времени суток. В unity проекте есть игровой мир (список звездных систем, объектов в них, подсистема контроля ходов/игровой даты). Проблема в том, что сейчас он представлен несколькими static классами и это начало создавать проблемы (нет единообразной десериализации мира как объекта, невозможно выкинуть его на растерзание GC и создать новый без костыльной очистки всех членов этих классов, к тому же в редакторе unity они не очищаются при остановке Play Mode и в результате может быть непредсказуемое поведение unit-тестов, запускающихся в оставшемся игровом мире и т.д. и т.п.).
Разумеется, если взять и убрать static, будет вот так:
Создал WorldContext, закинул в него эти самые WorldCtl, StarSystems и т.д.. Вот только как теперь довести его до всей этой толпы желающих? Конечно, можно просто создать статическое поле вида CurrentWorldContext, благо одновременная симуляция нескольких миров вряд ли понадобится. Но все же тот факт, что сущности, логически относящиеся к другому миру, могут внезапно обратиться к текущему, не радует, костыль же. Передавать его в конструкторы всех-всех-всех... слишком много boilerplate, что тоже плохо, да и память почем зря расходуется.
Может быть уже есть известные пути решения этой проблемы?
Подумал над таким методом решения проблемы: ввести интерфейс с одним свойством
public interface IWorldContextProvider
{
WorldContext WorldContext { get; }
}
И реализовывать его "по цепочке" (т.е., скажем, реализация этого свойства для оборудования корабля будет возвращать это же свойство родительского корабля и т.д.). Но может есть более простое решение?