【问题标题】:Azure Functions with dependance injection trough constructor don't find job functions通过构造函数进行依赖注入的 Azure Functions 找不到作业函数
【发布时间】:2021-11-03 15:06:38
【问题描述】:

我使用 .NET 5 创建了 Azure Function 版本 3,并通过类的构造函数进行了依赖注入。请参阅下面的虚拟代码:

public class MyAzureFunction
{
    private readonly IMyRepository _myRepository;

    public MyAzureFunction(IMyRepository myRepository) 
    {
        _myRepository = myRepository;
    }

    [Function("MyAzureFunction")]
    public async Task Run([TimerTrigger("0 */15 * * * *")] TimerInfo myTimer, FunctionContext context)
    {
        ILogger logger = context.GetLogger("MyAzureFunction");
        logger.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");

        List<object> result = await _myRepository.GetAllAsync();

        // Keep going...
    }
}

Startup 类中添加了作用域。

[assembly: FunctionsStartup(typeof(MyNamespace.Functions.Startup))]
namespace MyNamespace.Functions
{
    public class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            builder.Services
                .AddScoped<IMyRepository, MyRepository>();
        }
    }
}

程序文件如下:

public class Program
{
    public static void Main()
    {
        IHost host = new HostBuilder()
            .ConfigureFunctionsWorkerDefaults()
            .Build();

        host.Run();
    }
}

.csproj 文件内有这行代码:

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <TargetFramework>net5.0</TargetFramework>
        <AzureFunctionsVersion>v3</AzureFunctionsVersion>
        <OutputType>Exe</OutputType>
    </PropertyGroup>
    <ItemGroup>
        <PackageReference Include="Microsoft.Azure.Functions.Extensions" Version="1.1.0" />
        <PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Timer" Version="4.1.0" />
        <PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" Version="1.3.0" />
        <PackageReference Include="Microsoft.Azure.Functions.Worker" Version="1.6.0" />
    </ItemGroup>
    <!-- Skiped some lines -->
</Project>

问题是当我想运行 Azure 函数时。我收到了这个警告:

未找到工作职能。尝试公开您的工作类别和方法。如果您正在使用绑定扩展(例如 Azure 存储、ServiceBus、计时器等),请确保您已在启动代码中调用了扩展的注册方法(例如builder.AddAzureStorage()builder.AddServiceBus()builder.AddTimers() 等)

我已经尝试了接下来的事情:

  1. 我在Startup 类中添加了builder.AddTimers(),但IFunctionsHostBuilder 不包含它的定义。即使我添加Microsoft.Azure.Functions.Worker.Extensions.Timer

  2. MyAzureFunction 中的所有内容设为静态,但由于静态构造函数不能包含参数,因此无法正常工作。

  3. 还有builder.Services.AddTimers()(如the documentation未定义。

我现在的问题是如何使用 Azure Functions 和使用构造函数的 .NET 5 进行依赖注入。

【问题讨论】:

  • 我在 Startup 类中添加了 builder.AddTimers(),但 IFunctionsHostBuilder 不包含它的定义。 那么您缺少程序集引用或 NuGet 包。您是否尝试找到并安装合适的软件包?
  • @DanielMann:嗯,我已经添加了Microsoft.Azure.Functions.Worker.Extensions.Timer,但同样的问题。
  • @H.Pauwelyn 您正在使用 dotnet-isolated 版本,并且依赖项在那里的工作方式不同,我已经提供了我的答案。它必须有效。

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


【解决方案1】:

在 Program.cs 中做以下事情。 (确保为命名空间添加引用)

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace FunctionApp2
{
    public class Program
    {
        public static void Main()
        {
            var host = new HostBuilder()
                .ConfigureServices(services =>
                {
                    services.AddScoped<IMyRepository, MyRepository>();
                })
                .ConfigureFunctionsWorkerDefaults()
                .Build();

            host.Run();
        }
    }
}

【讨论】:

  • 您必须使用自己的命名空间而不是 FunctionApp2,但其他方法都可以。
  • 不,即使我评论了Startup 类,它也不起作用......我的信息与问题中的相同。
  • 我没有遇到任何问题,它正在工作。为了您的帮助,我已上传到 github repo,这是工作版本,它每分钟都会调用一次。 github.com/jp1482/TimerFunctionAppDotnetIsolated
  • 您添加的链接转到 404 页面。
  • 是的,这是有效的。可能这是产生错误的依赖关系的依赖关系。我会搜索它。这是我的 +1 ☺。
【解决方案2】:

你需要添加包:

  • Microsoft.Azure.Functions.Extensions

  • Microsoft.Azure.Functions.Worker

  • Microsoft.Azure.Functions.Worker.Sdk

然后确保删除之前的 .NET Core 3 包。

【讨论】:

  • 他们已经安装在项目中但没有解决问题。我已经更新了我的问题。
  • 关于“未找到工作职能”。尝试将你的工作类和方法公开的问题,也许可以参考stackoverflow.com/questions/47682760/…。我认为上次在本地也遇到了这个问题并更新了 azure-functions-core-tools。
  • 也只是为了仔细检查你的 csproj 文件中的&lt;ItemGroup&gt; &lt;None Update="host.json"&gt; &lt;CopyToOutputDirectory&gt;PreserveNewest&lt;/CopyToOutputDirectory&gt; &lt;/None&gt; &lt;None Update="local.settings.json"&gt; &lt;CopyToOutputDirectory&gt;PreserveNewest&lt;/CopyToOutputDirectory&gt; &lt;CopyToPublishDirectory&gt;Never&lt;/CopyToPublishDirectory&gt; &lt;/None&gt; &lt;/ItemGroup&gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-09
  • 2011-02-02
  • 2010-12-02
  • 1970-01-01
  • 2019-04-20
相关资源
最近更新 更多