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
を出力すると、
正常に依存性注入されたことが確認できました。