【问题标题】:IExtensionConfigProvider not initializing or binding with Microsoft.Azure.WebJobs v3IExtensionConfigProvider 未初始化或与 Microsoft.Azure.WebJobs v3 绑定
【发布时间】:2018-08-31 23:13:26
【问题描述】:

我们使用与 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”绑定到自定义类型。确保 绑定支持参数类型。

下面是示例应用的代码:

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

【问题讨论】:

标签: c# azure azure-functions


【解决方案1】:

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

然后在您的 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));
    }
}

要让主机加载扩展,必须在 bin/extensions.json 文件中,通过 func extensions install 命令在 JavaScript 或 Java 函数中注册它。在 C# 中,SDK 1.0.19 查看在当前函数项目或任何依赖项(ProjectReferencePackageReference),并生成对应的extensions.json文件。

【讨论】:

  • 谢谢!最后一段对我来说有点不清楚 - 如果我在 C# 中添加 WebJobsStartup 属性,我还需要手动创建 extensions.json 文件吗?
  • 否,通过使用 WebJobsStartup,sdk 在构建时生成它。
  • 伙计,你拯救我的一天!
  • 目前在发布时创建正确的 extensions.json 存在问题,当它在函数程序集中时不包括启动类。可以在这里找到解决方法github.com/Azure/azure-functions-host/issues/…
  • 对于其他想知道的人,可以在“Microsoft.Azure.WebJobs.Extensions”NuGet 包中找到 WebJobsStartup 和相关类型。
猜你喜欢
  • 2022-06-19
  • 2021-08-20
  • 1970-01-01
  • 1970-01-01
  • 2021-10-13
  • 1970-01-01
  • 1970-01-01
  • 2017-01-22
  • 1970-01-01
相关资源
最近更新 更多