トマシープが学ぶ

Unity/VR/AR/デザイン好きのミーハー 記事内容は自分用のメモです

Zenjectのお勉強

こちらの本を買ったのでZenject勉強する

booth.pm

Interface

まずInterfaceを完全に理解しないといけない。

Interface使ったことないから、何度読んでも忘れてしまう

bibinbaleo.hatenablog.com

DIコンテナ

密結合を疎結合にしていっても、誰かは依存関係を知っている必要がある。

知っているクラスがDIコンテナ

DIコンテナを自分で作るのは大変らしい。

そこでZenject

Zenject

modesttree社のリポジトリが元

github.com

メインの人がmodesttree社を退職して、Zenjectをフォークして機能追加をしているのがExtenject

github.com

続き物だったんだ~

ちなみにExtenjectも配布しているunitypackage名はzenjectだった

f:id:bibinbaleo:20201225163944p:plain

ーー

Zenjectとは違うDIコンテナとしてVContainerというのを日本の方?が作っているみたい

hadashia.hatenablog.com

Zenject使ってみる

使ってみる。zenject(extenject)のv9.1.0を入れた。

f:id:bibinbaleo:20201225163904p:plain

Bind,Inject,Context

二つのC#をを作る。片方から片方を参照する

ZenjectBindingというコンポーネントをどこかにつけて、それに渡したいコンポーネントをセットする

f:id:bibinbaleo:20201225165923p:plain

DIコンテナに情報を登録することをBind

バインドしたオブジェクトを渡すことをInject

 

Injectしたいところに[Inject]と付ける(呼び出す側)

f:id:bibinbaleo:20201225170416p:plain

 

ヒエラルキーでZenject>SceneContextを作る。

f:id:bibinbaleo:20201225164641p:plain

コンテナを使ってInject を行うのがContext

SceneContextはContextの一種

f:id:bibinbaleo:20201225164847p:plain

 

 

これが一連の流れみたい!

f:id:bibinbaleo:20201225171832p:plain

ContextとInjectの図示の仕方がよくわからないが、まあいいや

Bind

今回BindはZenjectBindingというコンポーネントを使ったけど、スクリプトからもBindできる。

 ZenjectBindingが使えるのはMonobehaviorなクラスの時のみ。

Installer

スクリプトからBindするときはInstallerというクラスを定義して、その中に書く

Create>Zenject>MonoInstallerでC#ができる

f:id:bibinbaleo:20201228101012p:plain

こんな感じ

using UnityEngine;
using Zenject;

public class UntitledInstaller : MonoInstaller
{
    public override void InstallBindings()
    {
       
    }
}

 この中に

Container.Bind<XXXX>().AsCached();

と書いてBindする

 

そしてInstallerをどこかのオブジェクトに付けてSceneContextのMonoInstallerにそのオブジェクトをタッチ!!!

f:id:bibinbaleo:20201228105109p:plain

これでBindできた

 

Container.Bind<XXXX>().AsCached();

のAsCachedの部分は何種類かある。

mikimemo.hateblo.jp

AsSingledはXXXインスタンスが一つしか生成されないことを保証する=シングルトンらしい。シングルトン・・・

 

Container.Bind以下はいろいろ種類があるらしい。本にも全部乗せれないレベル!すごーい。とはいえよく使うのは載っているらしいので、辞書的な感じで使えそう?

公式のドキュメントはリポジトリのreadmeみたい。すごい長い

GitHub - modesttree/Zenject: Dependency Injection Framework for Unity3D

 

クラス名はIExampleだけど、実際にInjectするのはExampleの時?

Container.Bind<IExample>().To<Example>()

 

Inject

フィールドに直接つけてもいいし、メソッドに付けてもいい

    [Inject]
    private FooBehavior _fooBehavior;

メソッドのほうが推奨されている。

zenjectを使わないとなった時に、メソッドのほうだと変更が少なくて済む

f:id:bibinbaleo:20201228101141p:plain

 その他

・動的にBindする

・シーンをまたいだDI

パラメーターを渡すZenjectSceneLoader

 

プロジェクト全体のContextであるProjectContextを使う。

マルチシーンを使うときはParentContract

DecoratorContext