Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带有依赖项注入的Azure函数不';我不能创建我的服务的实例_C#_.net_Azure_Dependency Injection_Azure Functions - Fatal编程技术网

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);
        }
    }
}