【Unity】VContainer最近知った内容をまとめた # 2

# はじめに
この記事は[Hamster Output Advent Calendar 2024](https://qiita.com/advent-calendar/2024/game_hamster)の6日目の記事です！

また、この記事は前回の続きです。今回は**AsSelf**や、**インタフェース関連**関連など、利用したことがある内容や、調べたことをまとめたいと思います。

# 参考にしたリンク

https://vcontainer.hadashikick.jp/ja/

https://qiita.com/sakano/items/b91e01f7fc0a946090ac

https://light11.hatenadiary.com/entry/2021/02/01/203252

# Registerを使う時に利用するAs関連
メソッドチェーンの様に、Registerの後にどんどん繋げて書くことができます！

### ・As
インタフェースを型にして登録することができます。ただし、登録されるのはインタフェースなので、元のクラスは登録されません。

```C#
protected override void Configure(IContainerBuilder builder)
{
    builder.Register<TestPureCSharp>(Lifetime.Singleton).As<ITestLog>();
}
```

### ・AsSelf
先ほどと同じようにインタフェースを型にして登録を行っていますが、**As**の後に、**AsSelf**が追加されています。**AsSelf**を追加することで、型の取得先と、登録する型をどちらも登録することができます。

```C#
protected override void Configure(IContainerBuilder builder)
{
    builder.Register<TestPureCSharp>(Lifetime.Singleton).As<ITestLog>().AsSelf();
}
```

### ・AsImplementedInterfaces
指定した型が持っているインタフェースを全て登録します。
ここの解釈が正しいかは正直微妙だけど...おおよそは合ってると思う。

```C#
protected override void Configure(IContainerBuilder builder)
{
    builder.RegisterComponentInHierarchy<TestMonoBehaviour>().AsImplementedInterfaces();
}
```

# VContainerにはインタフェースが沢山ある

沢山ありますがほぼUnityのライフサイクル見たいな物です。
・それぞれのインタフェースはUnityのライフサイクルと同様に実行される
・Postがついているメソッドはそのライフサイクルの後に実行される

もし、MonoBehaviourと同じ使い方をする場合、**IStartable**と**ITickable**を利用すると同じ動作になります。

現状、**IInitializable**と**IPostInitializable**の実行されるタイミングである、**PlayerLoop**についてはあまり分かっていないので飛ばします。

※using VContainer.Unity;を忘れずに...!

### ・IInitializable
PlayerLoopのInitializationの前に実行される
```C#
public class Sample : IInitializable
{
    public void Initialize()
    {

    }
}
```

### ・IPostInitializable
PlayerLoopのInitializationの後に実行される
```C#
public class Sample : IPostInitializable
{
    public void PostInitialize()
    {

    }
}
```

### ・IStartable
MonoBehaviourのStart時に実行される

```C#
public class Sample : IStartable
{
    public void Start()
    {

    }
}
```

### ・IPostStartable
MonoBehaviourのStart後に実行される

```C#
public class Sample : IPostStartable
{
    public void PostStart()
    {

    }
}
```

### ・IFixedTickable
MonoBehaviourのFixedUpdate時に実行される

```C#
public class Sample : IFixedTickable
{
    public void FixedTick()
    {
    
    }
}
```

### ・IPostFixedTickable
MonoBehaviourのFixedUpdate後に実行される

```C#
public class Sample : IPostFixedTickable
{
    public void PostFixedTick()
    {
    
    }
}
```

### ・ITickable
MonoBehaviourのUpdate時に実行される

```C#
public class Sample : ITickable
{
    public void Tick()
    {
    
    }
}
```

### ・IPostTickable
MonoBehaviourのUpdate後に実行される

```C#
public class Sample : IPostTickable
{
    public void PostTick()
    {
    
    }
}
```

### ・ILateTickable
MonoBehaviourのLateUpdate時に実行される

```C#
public class Sample : ILateTickable
{
    public void LateTick()
    {
    
    }
}
```

### ・IPostLateTickable
MonoBehaviourのLateUpdate後に実行される

```C#
public class Sample : IPostLateTickable
{
    public void PostLateTick()
    {
    
    }
}
```

# その他&使ったけどよく分からない

### ・WithParameter
Vcontainerで、生成したクラスのコンストラクタ引き数とかに特定の値を入れる時に利用するのかな...?
```C#
protected override void Configure(IContainerBuilder builder)
{
    builder.RegisterEntryPoint<TestPureCSharp>().WithParameter("a");
}

// これが呼び出してるクラス
public class TestPureCSharp : IStartable
{
    public TestPureCSharp(string message)
    {
        Debug.Log(message);
    }

    public void Start()
    {

    }
}
```

# まとめ

・As関連を利用することで、型の取得先と登録したい型を**どちらも登録できる**

・VContainerのインタフェースは沢山あるけど、MonoBehaviourと同じ動作をするだけなら**IStartable**と**ITickable**を利用する

・**WithParameter**を使うとコンストラクタ引き数を自分で初期化できる
↑
引き数ありのコンストラクタに、何も入れずにエラーが出たから初期化する時に利用するメソッドだと思う。