我正在使用一个天青耐久功能来编排其他函数,目前包含在同一个项目中。我想为这些精心编排的函数配置服务和日志记录。我怎么能这么做?
下面是一些更详细的内容:
在“普通”Azure函数中,我有一个Program.cs和一个Main方法,它的代码设置了函数执行的环境:
var host = new HostBuilder()
.ConfigureFunctionsWorkerDefaults()
.ConfigureLogging(loggingBuilder => { loggingBuilder.SetMinimumLevel(LogLevel.Trace); })... etc. pp.使用HostBuilder,我可以添加额外的日志服务提供者,添加缓存服务等。然后通过Azure函数的构造函数注入这些服务。
现在比较而言,当通过VS代码“持久性函数编排”模板创建持久函数项目时,没有Program.cs、HostBuilder和构造函数。只有一些静态方法表示协调器和编排的函数。
由于在“持久函数编排”模板中没有开箱即用的HostBuilder --对于持久函数而言,HostBuilder等效是什么样子?这里的模式或惯例是什么?我自己写吗?或者,是否有一些实例浮动或初始化我可以挂钩?还是应该将编排好的函数放在单独的Azure函数项目中,以便我可以使用HostBuilder
如有任何提示,将不胜感激。
发布于 2022-02-06 16:42:56
发布于 2022-02-06 21:27:57
因此,解决方案是使用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:错误索引方法‘DurableFunctionsOrplationCSharp1_Hello’。Microsoft.Azure.WebJobs.Host:无法将参数'myService‘绑定到IMyService类型。确保绑定支持参数Type。如果使用绑定扩展(例如Azure存储、ServiceBus、计时器等)确保您已经为启动代码中的扩展调用了注册方法(例如builder.AddAzureStorage()、builder.AddServiceBus()、builder.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();
});
}
}
}因此,如果要将依赖注入到构造函数中,则依赖注入适用于持久函数。
https://stackoverflow.com/questions/71009029
复制相似问题