具有依赖关系注入的Azure Function不会创建我的服务实例

时间:2019-07-24 14:24:21

标签: c# .net azure dependency-injection azure-functions

我正在关注这篇文章,并实现了Startup类,以便可以将我的服务注入到构造函数中,但是服务实例始终为null,并且在运行应用程序时得到Object reference not set to an instance of an object

下面是我的Startup班。

[assembly: FunctionsStartup(typeof(Backup.Functions.Startup))]
namespace Backup.Functions {
    public class Startup: FunctionsStartup {
        public override void Configure(IFunctionsHostBuilder builder) {
            builder.Services.AddSingleton < IBlobService,
            BlobService > ();
        }
    }
}

我的功能代码如下。

public class DeleteDailyBlobs {
    private static IBlobService _blobService;
    public DeleteDailyBlobs(IBlobService blobService) {
        _blobService = blobService;
    } 
    [FunctionName("DeleteDailyBlobs")]
    public static void Run([TimerTrigger("0/3 * * * * *")] TimerInfo myTimer, ILogger log) {
        if (_blobService.PerformTasks().GetAwaiter().GetResult()) {
            log.LogInformation(SuccessMessages.FunctionExecutedSuccessfully);
        }
        else {
            log.LogError(ErrorMessages.SomethingBadHappened);
        }
    }
}

_blobService始终为空。

enter image description here

2 个答案:

答案 0 :(得分:2)

最后,我能够找到问题所在,不幸的是,我忘了标记功能non static,所以我要做的就是从Azure函数中删除static关键字。删除之后,一切都很好。

public void Run([TimerTrigger("0/3 * * * * *")]TimerInfo myTimer, ILogger log)

enter image description here

希望有帮助。

正如Nkosi所提到的,我们应该将函数的返回类型标记为Task,而我已经写了一篇关于此函数的文章,可以在here找到。

答案 1 :(得分:0)

除了使函数成为非静态成员外,还应使函数返回Task并等待异步函数调用。

public class DeleteDailyBlobs {
    private readonly IBlobService blobService;

    public DeleteDailyBlobs(IBlobService blobService) {
        this.blobService = blobService;
    } 

    [FunctionName("DeleteDailyBlobs")]
    public async Task Run([TimerTrigger("0/3 * * * * *")] TimerInfo myTimer, ILogger log) {
        if (await blobService.PerformTasks()) {
            log.LogInformation(SuccessMessages.FunctionExecutedSuccessfully);
        }
        else {
            log.LogError(ErrorMessages.SomethingBadHappened);
        }
    }
}

并且由于依赖项也作为单例添加,因此确实也没有必要将其设为静态字段。该实例将在注入的任何地方都相同。