IExtensionConfigProvider

IExtensionConfigProvider

我们通过与IExtensionConfigProvider的参数绑定(bind)在Azure函数(netstandard20上的v2)中使用依赖项注入(inject)。将Microsoft.NET.Sdk.Functions从1.0.13升级到1.0.19(这将Microsoft.Azure.Webjobs.Host强制升级到v3)后,此功能不再起作用。我再也无法在IExtensionConfigProvider.Initialize函数中达到断点了。对于具有目标框架net462的示例项目,使用相同功能版本的SDK可以很好地使用Microsoft.Azure.WebJobs v2。

这是运行时给出的错误:



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

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

最佳答案

在v3中对DI所做的更改以及扩展模型以创建扩展( IExtensionConfigProvider 实现是扩展)之后,您现在首先需要使用 [assembly:WebJobsStartup] 程序集属性并实现 IWebJobsStartup创建启动类。 接口(interface)。您可以在其中通过 builder.services 向构建器添加自己的服务,并注册扩展程序的config provider类:

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

然后,可以在 IExtensionConfigProvider 中,通过构造函数注入(inject)来注入(inject)任何依赖关系,例如,绑定(bind),bindingproviders或任何其他自定义依赖关系。在您的情况下,您仅可以获取对内置 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));
    }
}

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

关于c# - IExtensionConfigProvider未初始化或与Microsoft.Azure.WebJobs v3绑定(bind),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52123538/

10-10 07:47