簡體   English   中英

IExtensionConfigProvider沒有初始化或綁定Microsoft.Azure.WebJobs v3

[英]IExtensionConfigProvider not initializing or binding with Microsoft.Azure.WebJobs v3

我們使用與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));
    }
}

通過在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));
    }
}

要使主機加載擴展,必須通過func extensions install命令在bin / extensions.json文件中,在JavaScript或Java函數中注冊。 在C#中, SDK 1.0.19查看當前函數項目中使用WebJobsStartup程序集屬性或當前項目的任何依賴項( ProjectReferencePackageReference )歸屬的類的構建時間,並生成相應的extensions.json文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM