# 依赖项注入

> Decouple hard-coded dependencies in your code using dependency injection for easier unit testing.

Cloud Code 支持依赖项注入 (DI)，这样您就可以分离代码中的硬编码依赖项，从而更轻松地进行单元测试。此处的 DI 基于 .Net 创建的类似系统。

Cloud Code 支持以下依赖项类型：

* 单例：单例依赖项创建一次，然后在需要时注入。
* 作用域：作用域依赖项针对每个请求创建一次。无论是在构造函数中还是在方法本身中使用都无关紧要，因为这两种情况下都关联到同一个对象。
* 瞬态：每次请求瞬态依赖项时创建瞬态依赖项。如果在构造函数中请求瞬态依赖项，然后在某个方法中再次请求，这两个请求将是两个单独的实例。

## 依赖项注入设置##dependency-injection-setup

为了设置依赖项，必须创建一个实现 `ICloudCodeSetup` 接口的类。

以下示例定义了一个单例接口及其实现，但您也可以通过 `AddScoped` 或 `AddTransient` 来使用作用域依赖项或瞬态依赖项。

*C#*

```cs
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>();
    }
}
```

请注意：

* 单例一次生成一个随机数，然后在服务处于活动状态期间保留这个随机数。
* 作用域针对每个请求创建一个新实例，但无论您在何处进行请求，该请求的数量都保持不变。
* 瞬态每次请求时都会创建一个新实例，因此每次都返回一个随机数。

## 依赖项注入用法##dependency-injection-usage

要支持依赖项注入，请将 `CloudCodeFunction` 及其类构造函数纳入您的方法，如以下示例所示。

*C#*

```cs
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(),
        };
    }
}
```

> **Warning:**
>
> **警告**：虽然会在多个请求之间保留单例，但请求之间仍可能有所不同，因为 Cloud Code 会在需要时扩展到多个 pod 以满足需求。

请参阅 Microsoft 关于[依赖项注入用法](https://learn.microsoft.com/en-us/dotnet/core/extensions/dependency-injection-usage#register-services-for-di)的文档。
