依存性注入

Cloud Code には依存性注入 (DI) のサポートがあります。これにより、コード内でハードコードされた依存関係を分離し、単体テストを簡単にすることができます。ここでの DI は、.Net によって作成される類似のシステムに基づいています。

Cloud Code は、以下の依存関係タイプのサポートを提供します。

  • シングルトン: シングルトン依存関係は、1 回作成されてから、必要に応じて挿入されます。
  • スコープ付き: スコープ付き依存関係は、リクエストごとに 1 回作成されます。コンストラクタで使用するかメソッドで使用するかは問題ではありません。どちらも同じオブジェクトにリンクするからです。
  • 一時的: 一時的依存関係は、リクエストされるたびに作成されます。コンストラクタで一時的依存関係をリクエストし、メソッドでもう一度リクエストする場合、この 2 つのリクエストは 2 つの別々のインスタンスです。

依存性注入の設定

依存関係を設定するには、ICloudCodeSetup インターフェースを実装するクラスを作成する必要があります。

以下の例では、シングルトンインターフェースとその実装を定義しますが、AddScoped または AddTransient を使用してスコープ付きまたは一時的依存関係を使用することもできます。

C#

using Unity.Services.CloudCode.Core;

namespace ExampleModule;

public interface IRandomNumber
{
    public int GetRandomNumber();
}

public class LockedRandomNumber : IRandomNumber
{
    private int randomNumber;

    public LockedRandomNumber()
    {
        randomNumber = Random.Shared.Next();
    }

    public int GetRandomNumber()
    {
        return randomNumber;
    }
}

public class ModuleConfig : ICloudCodeSetup
{
    public void Setup(ICloudCodeConfig config)
    {
        config.Dependencies.AddSingleton<IRandomNumber, LockedRandomNumber>();
    }
}

メモ:

  • シングルトンは、乱数を 1 回生成し、サービスがライブである限りそれを保持します。
  • スコープ付きでは、リクエストごとに新しいインスタンスが作成されますが、どこでリクエストするかにかかわらず、そのリクエストに対する数値は同じままです。
  • 一時的では、1 回リクエストするたびに新しいインスタンスが作成されるため、毎回乱数が返されます。

依存性注入の使用方法

依存性注入をサポートするには、以下の例で示すように、メソッドに CloudCodeFunction 属性をクラスコンストラクタとともに指定します。

C#

using Unity.Services.CloudCode.Core;

namespace ExampleModule;

public struct DependencyInjectionResult
{
    public int ConstructorNumber;
    public int MethodNumber;
}

public class TestDependencyInjection
{
    private int number;

    public TestDependencyInjection(IRandomNumber randomNumber)
    {
        number = randomNumber.GetRandomNumber();
    }

    [CloudCodeFunction("TestInjection")]
    public DependencyInjectionResult TestInjection(IRandomNumber randomNumber)
    {
        return new DependencyInjectionResult
        {
            // Will always return the same number during the session
            ConstructorNumber = number,
            MethodNumber = randomNumber.GetRandomNumber(),
        };
    }
}

警告: シングルトンは複数のリクエスト間で保持されますが、需要を満たすために必要な場合、Cloud Code は複数のポッドにスケールされるため、リクエスト間では異なる可能性があります。

依存性注入の使用方法 については、Microsoft のドキュメントを参照してください。