当前位置: 首页 > 知识库问答 >
问题:

如何在Azure函数中混合自定义参数绑定和依赖注入?

卞云瀚
2023-03-14

我有一个Azure Functions应用程序,它使用在[WebJobsStartup]中初始化的自定义参数绑定-如何将这些绑定迁移到新的[FunctionsStartup]方式?

在[WebJobsStartup]中,通过调用生成器注册绑定。带有.AddBindingRule的AddExtension

现在,新的Azure SDK说要使用[FunctionsStartup]——我该如何连接(或替换)。在这里添加BindingRule?

FunctionsStartup实现如下所示:-

[assembly: FunctionsStartup(typeof(EventSourcingOnAzureFunctions.Common.Startup))]
namespace EventSourcingOnAzureFunctions.Common
{
    public class Startup
        : FunctionsStartup
    {

        public override void Configure(IFunctionsHostBuilder builder)
        {

            builder.AddAppSettingsToConfiguration();

            // Initialise any common services
            CQRSAzureBindings.InitializeServices(builder.Services);

            builder.Services.AddWebJobs(ConfigureWebJobs  );

        }

        public void ConfigureWebJobs(JobHostOptions hostOptions)
        {

        }
}

它用来注册绑定规则的方式如下:-

        /// <summary>
        /// Initailise any common dependency injection configuration settings
        /// </summary>
        /// <param name="context"></param>
        public static void InitializeInjectionConfiguration(ExtensionConfigContext context)
        {


            // Set up the dependency injection stuff for the custom bindings 
            // 1: EventStream
            context
                .AddBindingRule<EventStreamAttribute>()
                .BindToInput<EventStream>(BuildEventStreamFromAttribute)
                ;
         }

如果我运行函数app,绑定规则代码不会被调用,结果函数索引失败,例如

Microsoft.Azure.WebJobs.Host: Error indexing method 'DepositMoney'.Microsoft.Azure.WebJobs.Host:无法绑定参数'bankAccountEvents'以键入EventStream。确保绑定支持参数 Type。如果使用的是绑定扩展(例如 Azure 存储、ServiceBus、计时器等),请确保已在启动代码(例如生成器)中调用了扩展的注册方法。AddAzureStorage(), builder.AddServiceBus(), builder.AddTimers() 等)。

共有2个答案

归俊杰
2023-03-14

您可以让[WebJobStartup]实例在Startup.cs中调用builder.AddExtension

在我的情况下,我需要使用 NuGet 包中的扩展

using Microsoft.Azure.WebJobs.Extensions.Kafka;

但是我经历了和你一样的情况,但是最后,我成功了:)

[assembly: 
FunctionsStartup(typeof(EventSourcingOnAzureFunctions.Common.Startup))]
namespace EventSourcingOnAzureFunctions.Common
{
    public class Startup
    : FunctionsStartup
    {

        public override void Configure(IFunctionsHostBuilder builder)
        {
            var serviceProvider = builders.Services.BuildServiceProvider();
            var env = serviceProvider.GetRequiredService<IHostEnvironment>();
            var appDirectory = serviceProvider.GetRequiredService<IOptions<ExecutionContextOptions>>().Value.AppDirectory;

            // IWebJobsBuilders instance
            var wbBuilder = builder.Services.AddWebJobs(x => { return; });
            wbBuilder.AddKafka();

            // And now you can use AddExtension
            // wbBuilder.AddExtension

        }
 }
庾波光
2023-03-14

要做到这一点,您将有两个单独的启动类。一个继承自FunctionsStartup,另一个实现IWebJobStartup接口。WebJobStartup首先运行,然后是FunctionsStartup。

以下是我测试它的方式。

WebJobsStartup类

namespace CustomBinding
{
    public class WebJobsStartup : IWebJobsStartup
    {
        void IWebJobsStartup.Configure(IWebJobsBuilder builder)
        {
            Debug.WriteLine("WebJobsStartup.Configure");
        }
    }
}

汇编信息类

using Microsoft.Azure.WebJobs.Hosting;

[assembly: WebJobsStartup(typeof(CustomBinding.WebJobsStartup))]

创业班

[assembly: FunctionsStartup(typeof(CustomBinding.Startup))]

namespace CustomBinding
{

    public class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            Debug.WriteLine("FunctionsStartup.Configure");
        }        
    }   
}
 类似资料:
  • 我有一个时间触发的Azure功能

  • 我想知道如何在ASP中处理依赖注入。NET核心,用于同时具有对象和字符串作为参数的类型。由于字符串无法注册到DI框架,我目前正在使用implementationfactory并使用服务定位器模式,还有其他方法吗?是否有类似于Autofac的命名参数的.WithParameter? Asp.net核心DI使得向DI框架注册一个类型变得容易(并且干净),对于那些已经向DI框架注册了参数的类型。 给定以

  • 希望一些比我更了解Azure功能的人能提供帮助。 开箱即用,您可以使用应用程序设置中的APPINSIGHTS_INSTRUMENTATIONKEY设置登录到应用程序Insights...这将在基本级别记录函数请求,然后允许您执行等操作。 这只是被跟踪器或ilogger所掩盖。

  • 我正在尝试为Azure Functions创建自己的自定义绑定。这项工作基于有关此功能的2篇wiki文章:https://github.com/Azure/azure-webjobs-sdk/wiki/Creating-custom-input-and-output-bindings和https://github.com/Azure/WebJobsExtensionSamples 对于示例项目,我

  • 我有我的,我想注入它。我想使用构造函数注入,因为我是这个类的所有者: 问题是,当触发时,该构造函数的参数(即依赖项)将作为附加项从中检索。所以我的问题是,如何将从检索的这些参数提供给我的构造函数注入? 谢谢你。

  • 问题内容: 我有许多函数结合了位置参数和关键字参数,我想将它们的参数之一绑定到给定值(仅在函数定义之后才知道)。有一般的方法吗? 我的第一次尝试是: 但是,为此,我需要知道传递给的确切args ,并且不能使用单个函数来绑定我感兴趣的所有函数(因为它们具有不同的参数列表)。 问题答案: from functools import partial >>> def f(a, b, c): … print