IExtensionConfigProvider没有初始化或绑定Microsoft.Azure.WebJobs v3

Tom*_*ber 4 c# azure azure-functions

我们使用与IExtensionConfigProvider的参数绑定在Azure函数(netstandard20上的v2)中使用依赖注入.将Microsoft.NET.Sdk.Functions从1.0.13升级到1.0.19(强制将Microsoft.Azure.Webjobs.Host升级到v3)之后,这不再起作用了.我无法在IExtensionConfigProvider.Initialize函数中找到断点.相同版本的Functions SDK适用于具有目标框架net462的示例项目,它使用Microsoft.Azure.WebJobs v2.

这是它在运行时给出的错误:

错误索引方法'Function1.Run'.Microsoft.Azure.WebJobs.Host:无法将参数'customThing'绑定到CustomType类型.确保绑定支持参数Type.

这是示例应用程序的代码:

    public static class Function1
{
    [FunctionName("ThisFunction")]
    public static async Task Run(
        [TimerTrigger("0 */1 * * * *")]TimerInfo timer,
        [Inject(typeof(CustomType))] CustomType customThing,
        ExecutionContext context)
    {
        Console.WriteLine(customThing.GetMessage());
    }
}

public class CustomType
{
    public string GetMessage() => "Hi";
}

[Binding]
[AttributeUsage(AttributeTargets.Parameter)]
public class InjectAttribute : Attribute
{
    public Type Type { get; }
    public InjectAttribute(Type type) => Type = type;
}

public class InjectConfiguration : IExtensionConfigProvider
{
    private IServiceProvider _serviceProvider;

    public void Initialize(ExtensionConfigContext context)
    {
        var services = new ServiceCollection();
        services.AddSingleton<CustomType>();
        _serviceProvider = services.BuildServiceProvider(true);

        context
            .AddBindingRule<InjectAttribute>()
            .BindToInput<dynamic>(i => _serviceProvider.GetRequiredService(i.Type));
    }
}
Run Code Online (Sandbox Code Playgroud)

Iña*_*oro 10

通过在v3到DI中进行的更改以及用于创建扩展的扩展模型(IExtensionConfigProvider实现是扩展),现在首先需要使用[assembly:WebJobsStartup]程序集属性并实现IWebJobsStartup接口来创建启动类.在那里,您可以通过builder.Services将您自己的服务添加到构建器并注册您的扩展的配置提供程序类:

[assembly: WebJobsStartup(typeof(WebJobsExtensionStartup ), "A Web Jobs Extension Sample")]
namespace ExtensionSample
{
    public class WebJobsExtensionStartup : IWebJobsStartup
    {
        public void Configure(IWebJobsBuilder builder)
        {
             //Don't need to create a new service collection just use the built-in one
             builder.Services.AddSingleton<CustomType>();                 

             //Registering an extension
             builder.AddExtension<InjectConfiguration>(); 
        }
    } 
}
Run Code Online (Sandbox Code Playgroud)

然后在您的IExtensionConfigProvider中,您可以通过构造函数注入注入任何依赖项,例如绑定,绑定提供程序或任何其他自定义依赖项.在您的情况下,您可以获得对内置IServiceProvider的引用:

public class InjectConfiguration : IExtensionConfigProvider
{
    private IServiceProvider _serviceProvider;

    public InjectConfiguration(IServiceProvider serviceProvider)
    {
       _serviceProvider = serviceProvider;
    }

    public void Initialize(ExtensionConfigContext context)
    {         
        context
            .AddBindingRule<InjectAttribute>()
            .BindToInput<dynamic>(i => _serviceProvider.GetRequiredService(i.Type));
    }
}
Run Code Online (Sandbox Code Playgroud)

要使主机加载扩展,必须通过func extensions install命令在bin/extensions.json文件中,在JavaScript或Java函数中注册.在C#中,SDK 1.0.19查看当前函数项目中使用WebJobsStartup程序集属性或当前项目的任何依赖项(ProjectReferencePackageReference)归属的类的构建时间,并生成相应的extensions.json文件.

  • 不,通过使用 WebJobsStartup,SDK 在构建时生成它。 (2认同)
  • 当前,这是在发布时创建正确的extensions.json的问题,当扩展类位于函数汇编中时,它不包括启动类。可以在这里找到一种解决方法https://github.com/Azure/azure-functions-host/issues/3386#issuecomment-419565714 (2认同)
  • 对于任何其他想知道的人,都可以在“ Microsoft.Azure.WebJobs.Extensions” NuGet包中找到WebJobsStartup和相关类型。 (2认同)