【发布时间】: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()等)。
我已经尝试了接下来的事情:
-
我在
Startup类中添加了builder.AddTimers(),但IFunctionsHostBuilder不包含它的定义。即使我添加Microsoft.Azure.Functions.Worker.Extensions.Timer。 -
将
MyAzureFunction中的所有内容设为静态,但由于静态构造函数不能包含参数,因此无法正常工作。 -
还有
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