[英]Azure Function with Dependency Injection doesn't create instance of my service
我正在关注这篇文章,并实现了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
始终为空。
最后我找到了问题所在,不幸的是我忘记将我的函数标记为non static
,所以我所要做的就是从我的 Azure 函数中删除static
关键字。 删除后,一切正常。
public void Run([TimerTrigger("0/3 * * * * *")]TimerInfo myTimer, ILogger log)
希望能帮助到你。
正如 Nkosi 所提到的,我们应该将函数的返回类型标记为Task
,我已经写了一篇关于此的文章,可以在这里找到。
除了使函数成为非静态成员之外,您还应该使函数返回一个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);
}
}
}
而且由于依赖项也是作为单例添加的,因此确实没有必要将其也设为静态字段。 实例将在注入时相同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.