Zenject - инструмент для управления зависимостями в Unity
Zenject - это библиотека внедрения зависимостей (DI) и управления жизненным циклом объектов (IoC) для Unity. Она предоставляет удобный и простой способ управления зависимостями и дает возможность более гибко организовывать приложение.
Основным концептом Zenject является понятие контейнера - объекта, который управляет созданием и уничтожением экземпляров классов и проводит их связывание между собой. Создание контейнера производится с помощью простой строки кода:
ContainerInstaller.Install(Container);
После этого можно начинать описывать зависимости в классе-наследнике от MonoInstaller:
public class MyInstaller : MonoInstaller
{
public override void InstallBindings()
{
Container.Bind().To().AsSingle().NonLazy();
}
}
В данном примере мы связываем интерфейс IMyInterface с классом MyClass, указываем, что создавать только один экземпляр (AsSingle()) и отложенную инициализацию (NonLazy()).
Далее, нам необходимо привязать MyInstaller к контейнеру:
public class GameController : MonoBehaviour
{
[Inject] private IMyInterface _myInterface;
private void Awake()
{
ContainerInstaller.Install(Container);
Container.Bind().FromComponentInHierarchy().AsSingle();
}
private void Start()
{
_myInterface.DoSomething();
}
}
Мы создаем экземпляр контейнера и связываем MyInstaller с объектом на сцене через метод FromComponentInHierarchy(). Теперь, при создании объекта GameController, контейнер автоматически проинжектирует ссылку на объект реализующий IMyInterface, что позволит нам вызвать метод DoSomething().
Один из главных преимуществ Zenject - использование конструкторной внедрения зависимостей. Вместо того, чтобы иметь большое количество зависимостей в виде полей или методов, они передаются через конструктор:
public class MyClass
{
private readonly ILogger _logger;
private readonly IMyService _myService;
public MyClass(ILogger logger, IMyService myService)
{
_logger = logger;
_myService = myService;
}
}
Это позволяет повысить надежность приложения и упростить тестирование. Кроме того, Zenject позволяет создавать мультибайндинг - связывания нескольких классов с одним интерфейсом:
public class MyInstaller : MonoInstaller
{
public override void InstallBindings()
{
Container.BindInterfacesTo().AsSingle();
Container.BindInterfacesTo().AsSingle();
}
}
Теперь оба класса будут инжектироваться по интерфейсу, что позволит использовать любую реализацию интерфейса в зависимости от контекста приложения.
В целом, Zenject является очень мощным инструментом для управления зависимостями в Unity и упрощения логики приложения. Он позволяет быстро и удобно организовывать приложение, а также повышает его модульность и гибкость.