依赖项注入
Cloud Code 支持依赖项注入 (DI),这样您就可以分离代码中的硬编码依赖项,从而更轻松地进行单元测试。此处的 DI 基于 .Net 创建的类似系统。
Cloud Code 支持以下依赖项类型:
- 单例:单例依赖项创建一次,然后在需要时注入。
- 作用域:作用域依赖项针对每个请求创建一次。无论是在构造函数中还是在方法本身中使用都无关紧要,因为这两种情况下都关联到同一个对象。
- 瞬态:每次请求瞬态依赖项时创建瞬态依赖项。如果在构造函数中请求瞬态依赖项,然后在某个方法中再次请求,这两个请求将是两个单独的实例。
依赖项注入设置
为了设置依赖项,必须创建一个实现 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>();
}
}
请注意:
- 单例一次生成一个随机数,然后在服务处于活动状态期间保留这个随机数。
- 作用域针对每个请求创建一个新实例,但无论您在何处进行请求,该请求的数量都保持不变。
- 瞬态每次请求时都会创建一个新实例,因此每次都返回一个随机数。
依赖项注入用法
要支持依赖项注入,请将 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 会在需要时扩展到多个 pod 以满足需求。
请参阅 Microsoft 关于依赖项注入用法的文档。