5. Привязчики (Binders) в StrangeIoC. Часть 1

По умолчанию Strange включает в себя несколько базовых привязчиков. Дале мы познакомимся с основными из них. А пока просто перечислим их:

  • InjectionBinder;
  • SignalCommandBinder;
  • MediationBinder;

В дополнение стоит отметить что Strange предоставляет все возможности по созданию своих кастомных привязчиков.

От теории перейдем к практике и создадим несколько привязок. Запустите Unity с установленным Strange и создайте новую сцену. В иерархии вновь созданной сцены создайте новый GameObject и назовите его Bindings_And_Binders_Context_View. Все остальные элементы сцены сделайте дочерними по отношению к этому. Объект Bindings_And_Binders_Context_View должен быть родительским для всех элементов сцены.

Контекст (Context) — еще одно важнейшее понятие Strange и в этом разделе мы создадим свой контекст, но описание того что это такое мы отложим до следующего раздела.

Создайте скрипт с именем BindingsAndBindersContext и скопируйте в него следующий класс:

using UnityEngine;
using strange.extensions.context.impl;
 
public class BindingsAndBindersContext : MVCSContext 
{
    #region Methods
 
    public BindingsAndBindersContext(MonoBehaviour view)
        : base(view, true)
    {
    }
    
    #endregion
 
    #region Methods
 
    protected override void mapBindings()
    {
    }
 
    #endregion
}

Создайте скрипт с именем BindingsAndBindersContextView, скопируйте в него следующий класс и прикрепите полученный скрипт к объекту Bindings_And_Binders_Context_View.

using strange.extensions.context.impl;

public class BindingsAndBindersContextView : ContextView 
{
    private void Awake()
    {
        context = new BindingsAndBindersContext(this);
        context.Start();
    }
}

В результате мы создали контекст BindingsAndBindersContext. BindingsAndBindersContextView – это представление контекста (context view) необходимое для инициации создания контекста. С помощью представлений в контексты могут быть переданы различные параметры из редактора Unity. Сразу после того как Strange инициализирует контекст и создаст все необходимые части, будет вызван метод mapBindings(). Этот метод – место для регистрации ваших привязок.

Создадим интерфейс IGun и несколько классов реализующих его:

public interface IGun
{
    void Fire();
}
 
public class Blaster : IGun
{
    private int _gunId = Random.Range(0, Int32.MaxValue);
 
    public void Fire()
    {
        Debug.Log(_gunId + " Pew - pew - pew!!!");
    }
}
 
public class Cannon : IGun
{
    private int _gunId = Random.Range(0, Int32.MaxValue);
 
    public void Fire()
    {
        Debug.Log(_gunId + " BOOOM!!!");
    }
}

Теперь в созданном нами контексте мы можем создать 2 привязки:

  • Привязать класс Blaster к интерфейсу IGun и дать привязке имя “GUN_1
  • Привязать класс Cannon к интерфейсу IGun и дать привязке имя “GUN_2
protected override void mapBindings()
    {
        injectionBinder.Bind<IGun>().To<Blaster>().ToName("GUN_1");
        injectionBinder.Bind<IGun>().To<Cannon>().ToName("GUN_2");
    }

Обратите внимание на поле _gunId. Каждый раз, когда будет создан инстанс Cannon или Blaster, это поле будет содержать случайное число. Продолжим и создадим классы для боевых юнитов.

public interface IUnit
{
    void GunFire();
}
 
public class Tank : IUnit
{
    [Inject("GUN_1")]
    public IGun Gun { get; set; }
 
    public void GunFire()
    {
        Gun.Fire();
    }
}
 
public class HeavyTank : IUnit
{
    [Inject("GUN_2")]
    public IGun Gun { get; set; }
 
    public void GunFire()
    {
        Gun.Fire();
    }
}

Добавим привязки и для них:

protected override void mapBindings()
    {
        injectionBinder.Bind<IGun>().To<Blaster>().ToName("GUN_1");
        injectionBinder.Bind<IGun>().To<Cannon>().ToName("GUN_2");
 
        injectionBinder.Bind<IUnit>().To<Tank>().ToName("UNIT_1");
        injectionBinder.Bind<IUnit>().To<HeavyTank>().ToName("UNIT_2");
    }

Теперь начинается самое интересное – резолвинг привязок, то есть получение инстансов из привязчика.