繁体   English   中英

Azure Function,依赖注入和循环

[英]Azure Function, Dependency Injection and loop

我有以下代码:

启动.cs:

    services.AddTransient<ProcessPendingDeactivateDeviceStatus>();

Function 代码:

public class FunctionPendingDeactivationStatusesCheck
{
    private readonly IDeviceService _deviceService;
    private readonly ProcessPendingDeactivateDeviceStatus _pendingDeviceStatus;


    public FunctionPendingDeactivationStatusesCheck(
        IDeviceService deviceService,
        ProcessPendingDeactivateDeviceStatus pendingDeviceStatus)
    {
        _deviceService = deviceService;
        _pendingDeviceStatus = pendingDeviceStatus;
    }

    [Singleton]
    [FunctionName("FunctionPendingDeactivationStatusesCheck")]
    public async Task Run([TimerTrigger("0 12,27,42,57 * * * *")] TimerInfo myTimer, ExecutionContext context, ILogger log)
    {
        var pendingDeletingDevices = _deviceService.GetDevicesByStatus(DeviceStatus.PendingDeleted);

        foreach (var device in pendingDeletingDevices)
        {
            await _pendingDeviceStatus.InitAsync(device);

因此,正如我们所见,我们在循环内调用InitAsync并在所有迭代中使用相同的实例。 我想为每次迭代重新创建这个 object 。 怎么做?

需要工厂才能获得所需的行为。

注册将用于创建实例的工厂委托

services.AddTransient<ProcessPendingDeactivateDeviceStatus>();
services.AddSingleton<Func<ProcessPendingDeactivateDeviceStatus>>(sp => 
    () => sp.GetRequiredService<ProcessPendingDeactivateDeviceStatus>()
);

注入工厂并根据需要创建实例

public class FunctionPendingDeactivationStatusesCheck {
    private readonly IDeviceService _deviceService;
    private readonly Func<ProcessPendingDeactivateDeviceStatus> factory;
    
    public FunctionPendingDeactivationStatusesCheck(
        IDeviceService deviceService,
        Func<ProcessPendingDeactivateDeviceStatus> factory) {
        _deviceService = deviceService;
        this.factory = factory;
    }

    [Singleton]
    [FunctionName("FunctionPendingDeactivationStatusesCheck")]
    public async Task Run([TimerTrigger("0 12,27,42,57 * * * *")] TimerInfo myTimer, ExecutionContext context, ILogger log) {
        var pendingDeletingDevices = _deviceService.GetDevicesByStatus(DeviceStatus.PendingDeleted);

        foreach (var device in pendingDeletingDevices) {
            ProcessPendingDeactivateDeviceStatus  _pendingDeviceStatus = factory();
            await _pendingDeviceStatus.InitAsync(device);

            //...

每次调用factory时,容器都会创建一个新的瞬态实例。

如果没有关于为什么每次迭代都需要一个新实例的任何细节,就无法判断在有很多设备的情况下创建那么多实例是否会产生任何不利影响。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM