首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >蔚蓝耐用的功能-在哪里的HostBuilder等效?

蔚蓝耐用的功能-在哪里的HostBuilder等效?
EN

Stack Overflow用户
提问于 2022-02-06 16:04:37
回答 2查看 498关注 0票数 1

我正在使用一个天青耐久功能来编排其他函数,目前包含在同一个项目中。我想为这些精心编排的函数配置服务和日志记录。我怎么能这么做?

下面是一些更详细的内容:

在“普通”Azure函数中,我有一个Program.cs和一个Main方法,它的代码设置了函数执行的环境:

代码语言:javascript
复制
var host = new HostBuilder()
    .ConfigureFunctionsWorkerDefaults()
    .ConfigureLogging(loggingBuilder => { loggingBuilder.SetMinimumLevel(LogLevel.Trace); })... etc. pp.

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

现在比较而言,当通过VS代码“持久性函数编排”模板创建持久函数项目时,没有Program.csHostBuilder和构造函数。只有一些静态方法表示协调器和编排的函数。

由于在“持久函数编排”模板中没有开箱即用的HostBuilder --对于持久函数而言,HostBuilder等效是什么样子?这里的模式或惯例是什么?我自己写吗?或者,是否有一些实例浮动或初始化我可以挂钩?还是应该将编排好的函数放在单独的Azure函数项目中,以便我可以使用HostBuilder

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

EN

回答 2

Stack Overflow用户

发布于 2022-02-06 16:42:56

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

代码语言:javascript
复制
[FunctionName("funcname")]
public async static Task RunOrchestrator(
    [OrchestrationTrigger] DurableOrchestrationContext context,
    ILogger log)
{
    log.LogInformation("Starting Orchestration");
}

如果您使用依赖项注入,则应该在启动检查 ()中执行以下操作;

也要检查

票数 1
EN

Stack Overflow用户

发布于 2022-02-06 21:27:57

因此,解决方案是使用FunctionsStartup类,如概述的这里。这将使依赖注入工作,也适用于持久的功能。

但对我来说,它并没有立即起作用,而且花了一段时间才弄清楚原因。我尝试的是在静态方法中添加一个附加参数(myService),如下所示:

代码语言:javascript
复制
[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()等)。

这个错误消息建议它应该工作,而在现实中它从来不工作。

解决方案是摆脱静态方法,使用带有构造函数的类。构造函数注入工作。

工人阶级的情况如下:

代码语言:javascript
复制
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实例,适当地调用构造函数,然后执行该函数。

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

代码语言:javascript
复制
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();
            });
        }
    }
}

因此,如果要将依赖注入到构造函数中,则依赖注入适用于持久函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71009029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档