c# - 如何在 Azure Functions 中混合使用自定义参数绑定(bind)和依赖项注入(inject)?

标签 c# dependency-injection parameters azure-functions

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

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

现在新的 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)
        {

        }
}

它用来注册绑定(bind)规则的方式是这样的:-

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

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

Microsoft.Azure.WebJobs.Host: Error indexing method 'DepositMoney'. Microsoft.Azure.WebJobs.Host: Cannot bind parameter 'bankAccountEvents' to type EventStream. Make sure the parameter Type is supported by the binding. If you're using binding extensions (e.g. Azure Storage, ServiceBus, Timers, etc.) make sure you've called the registration method for the extension(s) in your startup code (e.g. builder.AddAzureStorage(), builder.AddServiceBus(), builder.AddTimers(), etc.).

最佳答案

您可以获得 [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

        }
 }

关于c# - 如何在 Azure Functions 中混合使用自定义参数绑定(bind)和依赖项注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57564396/

相关文章:

c# - 带点的 URL 会导致 404 错误

angular - 在 Angular 自定义错误处理程序中使用服务

c# - ELMAH 中的错误信号不适用于 ASP.NET MVC

C# 如何跨库边界在 IServiceCollection 中构建集合?

服务中的 Grails jms 和 Atmosphere 插件 null springSecurityService 注入(inject)

c# - 如何在 VSTemplate 中创建评估的自定义参数

swift - 如何创建一个内联匿名函数,以便在函数调用中立即使用?

winapi - 为什么 WSAStringToAddress 采用非常量 AddressString?

c# - 如何从很长的路径获取文件的创建日期时间?

c# - 在 Window 应用程序中用 C# 打开 Pdf 文档