我正在关注这篇文章,并实现了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
始终为空。
答案 0 :(得分:2)
最后,我能够找到问题所在,不幸的是,我忘了标记功能non static
,所以我要做的就是从Azure函数中删除static
关键字。删除之后,一切都很好。
public void Run([TimerTrigger("0/3 * * * * *")]TimerInfo myTimer, ILogger log)
希望有帮助。
正如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);
}
}
}
并且由于依赖项也作为单例添加,因此确实也没有必要将其设为静态字段。该实例将在注入的任何地方都相同。