5

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

在 [WebJobsStartup] 中,绑定是通过调用 builder.AddExtension 和 .AddBindingRule 来注册的

现在新的 Azure SDK 说要使用 [FunctionsStartup] - 我如何在其中加入(或替换).AddBindingRule

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)
                ;
         }

如果我按原样运行函数应用程序,则绑定规则代码不会被调用,因此函数索引失败,例如

Microsoft.Azure.WebJobs.Host:索引方法“DepositMoney”出错。Microsoft.Azure.WebJobs.Host:无法将参数“bankAccountEvents”绑定到类型 EventStream。确保绑定支持参数类型。如果您正在使用绑定扩展(例如 Azure 存储、ServiceBus、计时器等),请确保您已在启动代码中调用了扩展的注册方法(例如 builder.AddAzureStorage()、builder.AddServiceBus( )、builder.AddTimers() 等)。

4

2 回答 2

4

为此,您将拥有两个独立的启动类。一个从 FunctionsStartup 继承,另一个实现 IWebJobsStartup 接口。WebJobsStartup 首先运行,然后是 FunctionsStartup。

这是我测试它的方法。

WebJobsStartup 类

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

AssemblyInfo 类

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");
        }        
    }   
}
于 2019-08-20T03:43:44.870 回答
4

您可以获取 [WebJobsStartup] 的实例以在 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

        }
 }
于 2020-05-02T15:33:20.443 回答