C# 带有依赖项注入的Azure函数不';我不能创建我的服务的实例
我遵循这篇文章,实现了C# 带有依赖项注入的Azure函数不';我不能创建我的服务的实例,c#,.net,azure,dependency-injection,azure-functions,C#,.net,Azure,Dependency Injection,Azure Functions,我遵循这篇文章,实现了Startup类,这样我就可以在构造函数中注入我的服务,但是服务实例总是空的,当我运行应用程序时,我得到的对象引用没有设置为对象的实例 下面是我的启动课程 [assembly: FunctionsStartup(typeof(Backup.Functions.Startup))] namespace Backup.Functions { public class Startup: FunctionsStartup { public override
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 > ();
}
}
}
这里的\u blobService
始终为空
最后我找到了问题所在,不幸的是我忘了将我的函数标记为非静态的,所以我所要做的就是从Azure函数中删除静态的关键字。移除后,一切都很好
public void Run([TimerTrigger("0/3 * * * * *")]TimerInfo myTimer, ILogger log)
希望能有帮助
正如Nkosi提到的,我们应该将函数的返回类型标记为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);
}
}
}
而且,由于依赖项也是作为一个单例添加的,因此实际上没有必要将其也设为一个静态字段。该实例在任何地方都将是相同的。这是一个非常好的观点,我已经更新了我的代码并写了一篇关于它的文章。信息已添加到答案中。需要等待它的原因是什么?为什么要在函数中插入blobservice包装器?您增加了代码的复杂性,降低了可维护性。你认为你在做单元测试吗?
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);
}
}
}