【Unity】【Zenject】Zenjectをサクッと使って理解する

Zenjectを簡単に使ってみて理解した気になる記事です。
詳しい使い方は他の記事を書くとして、この記事ではZenjectの概要をつかむことを目的とします。

Unity2018.2.0
Zenject 7.3.1

Zenject?依存性注入?

Zenjectとは、依存性注入(DI)のためのツールです。

たとえば、IExampleというインタフェース型のフィールドをもつInjectedというクラスがあるとします。

public interface IExample{}

public class Injected : MonoBehaviour
{
    private IExample _example;
}

一方でIExampleを実装したExampleクラスがあります。

public class Example : IExample{}

このInjectedExample疎結合にしたいです。
要するにInjectedのなかで_example = new Example()とかやりたくありません。

そんな時Zenjectを使うと、Exampleを生成してシーンに置かれているInjectedに依存性注入してくれます。
InjectedにはExampleインスタンスが注入されますが、あくまでInjectedが知っているのはIExampleだけなので疎結合が保たれます。

Zenjectはそんな感じのツールです。
Asset Storeで無料で提供されています。

assetstore.unity.com

使い方1 クラスを作成

それではZenjectの使い方を簡単に説明します。
まず依存性注入されるクラス、するクラス、インタフェースを作成します。

using UnityEngine;
using Zenject; // Zenjectをusing

public class Injected : MonoBehaviour
{
    // 依存性注入するフィールドにはInjectアトリビュートを付ける
    // これがZenjectが依存性注入する際の目印となる
    [Inject]
    private IExample _example;
}

public interface IExample{} // Injectedが知ることのできるインタフェース
public class Example : IExample{} // Injectedに注入されるクラス

IExampleインタフェース型のフィールドを作り、Injectアトリビュートを付けています。
このアトリビュートを目印としてZenjectが依存性を注入します。

使い方2 Installerを作成

次に実際に依存性を注入するクラスInstallerを作ります。
Projectビューで右クリック > Create > Zenject > MonoInstallerを選択します。

f:id:halya_11:20181226233556p:plain

スクリプトが生成されるのでこんな感じに書き換えます。

using Zenject;

public class ExampleInstaller : MonoInstaller
{
    public override void InstallBindings()
    {
        Container
            .Bind<IExample>() // InjectアトリビュートがついているIExample型のフィールドに
            .To<Example>() // Exampleクラスのインスタンスを注入する
            .AsTransient();
    }
}

これで「InjectアトリビュートがついているIExampleインタフェース型のフィールドに、
Example型のインスタンスを注入する」という意味になります。
MonoInstaller以外のInstallerもありますが、本記事では割愛します。

使い方3 Contextを作成

次にContextというものを作ります。
Hierarchyで右クリック > Zenject > SceneContextを選択します。

f:id:halya_11:20181226234821p:plain

このGameObjectに前節のExampleInstallerをアタッチし、SceneContextMonoInstallersに代入します。

f:id:halya_11:20181227000814p:plain

これで「このScene内でInjectアトリビュートがついているものを依存性注入(Install)の対象とする」という意味になります。
すなわち、ContextとはInstallerが影響する範囲を指定するものです。
SceneContext以外のContextもありますが、本記事では説明しません。

Injectedを置いて再生

あとは最初に作ったInjectedを適当なGameObjectにアタッチして再生します。

確認用にInjectedUpdate_exampleを出力すると、

f:id:halya_11:20181227001536p:plain

正常に依存性注入されたことが確認できました。

参考

qiita.com