サービスロケーター パターン
依存関係を 解決しに行く 手法
public class ServiceLocator
{
private Dictionary container = new Directionary(1);//GCAllocがおこらないようにある程度のキャパシティをはじめから確保しておく
public T Resolve()
{
return (T)container[typeOf(t)];
}
public void Register<T>(T instance)
{
container.Add(typeOf(T),instance);
}
}
依存性の注入
Dependency Injection
依存するオブジェクトを注入するパターン
DIContinerというものがあり、依存関係を設定しておくと、それに応じて自動的にインスタンスを設定して回ってくれるオブジェクトです。
zenjectでのインスタンスプレハブをDIcontinerを使う方法
Factoryを経由してインスタンスを生成する
例
class MoveFactory:PlaceholderFactory//継承してクリエイトできるようにする
{
//経由するためのものなのでからでもよい
//マーカー的な感じ
}
public class UnityTestInstaller:MonoInstaller
{
GameObject prefab;
public override void InstallBinding()
{
Continer
.BindFactory<Mover,MoverFactory>()
.FromCompenentInNewPrefab(prefab);
}
}
使う際は
public class MoveGene:MonoBehaviour
{
[inject] private MoveFactory factory;
void Start()
{
factory.Create();//生成
}
}
DIcontinerを直接使って生成する場合
public class MoverGenerator: MonoBehaviour
{
private GameObject MoverPrefab;
[Inject] private DiContainer container;//コンテナを取得
void Start()
{
// Containerから直接生成する
container.InstantiatePrefab(MoverPrefab);
var go = Instantiate(MovePrefab);
//AddComponentみたいな使い方もできる
container.InstantiateComponent<Mover>(go);
}
}