[英]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程序集屬性或當前項目的任何依賴項( ProjectReference或PackageReference )歸屬的類的構建時間,並生成相應的extensions.json文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.