うにてぃブログ

UnityやUnreal Engineの記事を書いていきます

【C#】インスタンスが登録してなくてもエラーにならない ServiceLocater

ServiceLocater のコードを見ていると インスタンスが登録されていない場合は エラーになるものが多く(多分)
もし、インスタンスがなくてもエラーにならないものを作る場合どのような実装になるのか気になったので、作成してみました

この ServiceLocater の呼び出しは以下のようになり

ServiceLocator<Test>.Do(t => t.Log());

インスタンスの呼び出し時に System.Action を利用しているため、内部で null チェックをできる
これによりインスタンスが無くてもエラーにならず動作させることができた

ただ、見づらくなってしまうので、これならばインスタンス呼び出して実行させた方がいい気がしてきました

コード

using System;
using UnityEngine;

public interface IService
{
}

public static class ServiceLocator<T> where T : IService
{
    private static T I;
    private static bool IsValid => I != null;

    public static void Register(T t)
    {
        I = t;
    }

    public static void Unregister()
    {
        I = default;
    }

    public static void Do(Action<T> action)
    {
        if (!IsValid)
        {
            Debug.LogWarning($"{typeof(T).Name} instance is null");
            return;
        }

        action?.Invoke(I);
    }
}

サンプル

using UnityEngine;
 
public interface ITest : IService
{
    void Log();
}
 
public class Test : ITest
{
    private int _value;
    public Test(int value)
    {
        _value = value;
    }

    public void Log()
    {
        Debug.Log(_value);
    }
}
 
public class SampleMonoBehaviour : MonoBehaviour
{
    private void Start()
    {
        ServiceLocator<Test>.Register(new Test(10));
        ServiceLocator<Test>.Unregister();
        // Null のときにエラーにならない
        ServiceLocator<Test>.Do(t => t.Log());
    }
}