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{}
このInjectedとExampleは疎結合にしたいです。
要するにInjectedのなかで_example = new Example()とかやりたくありません。
そんな時Zenjectを使うと、Exampleを生成してシーンに置かれているInjectedに依存性注入してくれます。
InjectedにはExampleのインスタンスが注入されますが、あくまでInjectedが知っているのはIExampleだけなので疎結合が保たれます。
Zenjectはそんな感じのツールです。
Asset Storeで無料で提供されています。
使い方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を選択します。

スクリプトが生成されるのでこんな感じに書き換えます。
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を選択します。

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

これで「このScene内でInjectアトリビュートがついているものを依存性注入(Install)の対象とする」という意味になります。
すなわち、ContextとはInstallerが影響する範囲を指定するものです。
SceneContext以外のContextもありますが、本記事では説明しません。
Injectedを置いて再生
あとは最初に作ったInjectedを適当なGameObjectにアタッチして再生します。
確認用にInjectedのUpdateで_exampleを出力すると、

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