Перейти к основному содержимому

ViewInitializer

ViewInitializer позволяет инициализировать View через Inspector без написания bootstrap-кода.

Содержание


Обзор

Вместо написания Bootstrap-скрипта:

// Без ViewInitializer — нужен скрипт:
private void Awake()
{
var viewModel = new PlayerViewModel();
_view.Initialize(viewModel);
}

Используйте компонент ViewInitializer — вся настройка через Inspector:

  1. Добавьте ViewInitializer на GameObject
  2. Укажите View (компонент MonoView)
  3. Укажите ViewModel (компонент, ScriptableObject или DI)
  4. Выберите этап инициализации (Awake, Start, OnEnable, Manual, Di)

ViewInitializer

Полностью автоматическая инициализация:

public class ViewInitializer : ViewInitializerBase
{
// Сериализованные поля — настраиваются в Inspector:
// - View компонент(ы)
// - ViewModel источник(и)
// - InitializeStage
// - _isDisposeViewOnDestroy
// - _isDisposeViewModelOnDestroy
}

InitializeStage

Определяет момент инициализации:

ЭтапКогдаДеинициализация
AwakeВ Awake()В OnDestroy()
StartВ Start()В OnDestroy()
OnEnableВ OnEnable()В OnDisable()
ManualПри вызове Initialize()При вызове Deinitialize()
DiConstructorПри inject из DI-контейнераВ OnDestroy()

Awake (по умолчанию)

Инициализация в Awake. Подходит для большинства случаев.

OnEnable / OnDisable

Полезно для переключаемых экранов — View инициализируется при активации и деинициализируется при деактивации:

GameObject.SetActive(true) → OnEnable → Initialize
GameObject.SetActive(false) → OnDisable → Deinitialize

Manual

Инициализация управляется из кода:

[SerializeField] private ViewInitializer _initializer;

public void Show(IViewModel viewModel)
{
_initializer.Initialize(); // Использует ViewModel из Inspector-настроек
}

public void Hide()
{
_initializer.Deinitialize();
}

DiConstructor

ViewModel разрешается через DI-контейнер. См. Интеграция с DI.


ViewInitializerManual

Упрощённый вариант, требующий явного вызова из кода:

[SerializeField] private ViewInitializerManual _initializer;

public void Show(IViewModel viewModel)
{
_initializer.Initialize(viewModel);
}

public void Hide()
{
_initializer.Deinitialize();
}

Отличия от ViewInitializer:

  • Нет InitializeStage — только ручной вызов
  • ViewModel передаётся в Initialize(IViewModel) напрямую
  • Нельзя инициализировать дважды без деинициализации

InitializeComponent

Компонент настройки View/ViewModel источника в ViewInitializer:

ResolveType

ТипОписание
ComponentСсылка на Component в Inspector
Reference[SerializeReference] — для POCO-объектов
ScriptableObjectСсылка на ScriptableObject
DiРазрешение через DI-контейнер (Zenject/VContainer)

ViewModelInitializeComponent

Специализация для ViewModel:

  • ResolveType.Component — указывает на MonoViewModel компонент
  • ResolveType.ScriptableObject — указывает на ScriptableViewModel
  • ResolveType.DiTypeSelector для выбора типа ViewModel из контейнера

Настройка в Inspector

Шаг 1: Добавьте ViewInitializer

Добавьте компонент ViewInitializer на GameObject.

Шаг 2: Настройте Stage

Выберите InitializeStage (по умолчанию Awake).

Шаг 3: Настройте View

В секции Views добавьте View-компоненты (MonoView).

Шаг 4: Настройте ViewModel

В секции ViewModel выберите ResolveType и укажите источник:

  • Mono — перетащите MonoViewModel из Inspector
  • ScriptableObject — перетащите ScriptableViewModel
  • Di — выберите тип для DI-разрешения

Шаг 5: Опции автоочистки

  • _isDisposeViewOnDestroy — автоматически деинициализировать View при OnDestroy
  • _isDisposeViewModelOnDestroy — автоматически вызвать Dispose на ViewModel

См. также