【问题标题】:Azure Function with Dependency Injection doesn't create instance of my service具有依赖注入的 Azure 函数不会创建我的服务实例
【发布时间】:2019-07-24 14:24:21
【问题描述】:

我正在关注这篇文章,并实现了Startup 类,以便我可以在构造函数中注入我的服务,但服务实例始终为空,并且当我运行应用程序时我得到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 始终为空。

【问题讨论】:

  • 为什么要在函数中注入 blobservice 包装器?您正在增加代码的复杂性并降低可维护性。你认为你在做单元测试吗?

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


【解决方案1】:

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

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

希望对你有帮助。

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

【讨论】:

    【解决方案2】:

    除了使函数成为非静态成员之外,您还应该使函数返回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);
            }
        }
    }
    

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

    【讨论】:

    • 这是一个非常好的观点,我已经更新了我的代码并写了一篇关于它的文章。该信息已添加到答案中。
    • 需要等待的原因是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    • 2020-03-02
    • 1970-01-01
    相关资源
    最近更新 更多