我们使用与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.
这是它在运行时给出的错误:
Error indexing method ‘Function1.Run’. Microsoft.Azure.WebJobs.Host:
Cannot bind parameter ‘customThing’ to type CustomType. Make sure the
parameter Type is supported by the binding.
这是示例应用程序的代码:
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文件.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。