Azure 持久函数 - HostBuilder 等效项在哪里?



我正在使用Azure耐用函数来协调当前包含在同一项目中的其他函数。我想为那些编排好的功能配置服务和日志记录。我该怎么做?

以下是更多细节:

在一个";正常的";Azure Function I有一个Program.csMain方法,其中包含以下代码,用于设置函数执行的环境:

var host = new HostBuilder()
.ConfigureFunctionsWorkerDefaults()
.ConfigureLogging(loggingBuilder => { loggingBuilder.SetMinimumLevel(LogLevel.Trace); })... etc. pp.

使用HostBuilder,我可以添加额外的日志记录提供程序、添加缓存服务等。然后通过Azure函数的构造函数注入这些服务。

现在相比之下,当通过VS代码"创建耐用功能项目时;耐用功能编排";模板中没有Program.csHostBuilder和构造函数。只有一些静态方法表示编排器和编排函数。

由于在"0"中不存在开箱即用的CCD_ 6;耐用功能编排";template-耐用功能的HostBuilder等价物看起来怎么样?这里的模式或惯例是什么?是我自己写的吗?或者是否有一些实例浮动或初始化我可以挂钩?或者应该将编排好的函数放入单独的Azure Function项目中,在那里我可以使用HostBuilder

如有任何提示,不胜感激。

默认情况下,除非您使用DI,否则会在函数中注入ILogger实例。您所需要做的就是使用ILogger。

[FunctionName("funcname")]
public async static Task RunOrchestrator(
[OrchestrationTrigger] DurableOrchestrationContext context,
ILogger log)
{
log.LogInformation("Starting Orchestration");
}

检查如果你使用依赖项注入,你应该在你的启动生成器中执行以下操作。Services.AddLogging((;

同时检查

因此,解决方案是使用此处概述的FunctionsStartup类。这应该使依赖项注入工作,也适用于持久函数。

但对我来说,这并没有立即奏效,我花了一段时间才弄清楚原因。我尝试的是在静态方法中添加一个额外的参数(myService(,比如

[FunctionName("DurableFunctionsOrchestrationCSharp1_Hello")]
public static string SayHello([ActivityTrigger] string name, ILogger log, IMyService myService)
{
log.LogInformation($"Saying hello to {name}.");
return $"Hello {name}!";
}

我还根据本应提供IMyService实现的文档添加了启动类。

这从来没有奏效。我得到的错误是:

Microsoft.Azure.WebJobs.Host:索引方法错误"持久功能搜索CSharp1_Hello"。Microsoft.Azure.WebJobs.Host:无法将参数"myService"绑定到键入IMyService。请确保参数Type受结合如果您正在使用绑定扩展(例如Azure Storage,ServiceBus、Timers等(确保您已拨打注册电话启动代码中扩展的方法(例如。建设者AddAzureStorage((,生成器。AddServiceBus((,建设者AddTimers((等(。

此错误消息表明它应该工作,而实际上它从来没有工作过。

解决方案是去掉静态方法,使用带有构造函数的类。施工单位注入工程。

工人阶级是这样的:

public class Activities
{
IMyService _service;
public Activities(IMyService service)
{
_service = service;
}
[FunctionName("DurableFunctionsOrchestrationCSharp1_Hello")]
public string SayHello([ActivityTrigger] string name, ILogger log)
{
log.LogInformation($"Saying hello to {name} {_service.GetType()}.");
return $"Hello {name}!";
}
}

请注意,我将函数移到了这里,使其成为非静态函数。

构造函数被正确调用,给定Startup类创建的IMyService实例,然后执行函数。

我用于测试的最小启动类如下:

using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
[assembly: FunctionsStartup(typeof(MyNamespace.Startup))]
namespace MyNamespace
{
public interface IMyService
{    
}
public class MyService : IMyService
{    
}
public class Startup : FunctionsStartup
{
public override void Configure(IFunctionsHostBuilder builder)
{
builder.Services.AddSingleton<IMyService>((s) => {
return new MyService();
});
}
}
}

因此,如果要将依赖项注入构造函数,则依赖项注入适用于耐用函数。

最新更新