要求:创建Azure功能,可以使用依赖注入将Entity Framework
上下文注入Run
方法。
这是我的Startup
课程
[assembly: WebJobsStartup(typeof(Startup))]
namespace MessagesToSqlDbFuncApp
{
internal class Startup : IWebJobsStartup
{
public void Configure(IWebJobsBuilder builder) =>
builder.AddDependencyInjection<ServiceProviderBuilder>();
}
}
这是ServiceProviderBuilder
类
public class ServiceProviderBuilder : IServiceProviderBuilder
{
public IServiceProvider Build()
{
IConfigurationRoot config = new ConfigurationBuilder()
.SetBasePath(Environment.CurrentDirectory)
.AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables()
.Build();
var connectionString = config.GetConnectionString("SqlConnectionString");
var services = new ServiceCollection();
services.AddDbContext<DataContext>(options => options.UseSqlServer(connectionString));
return services.BuildServiceProvider(true);
}
}
这是我的功能
[FunctionName("MessagesToSqlDbFuncApp")]
public static async Task Run([BlobTrigger("messagecontainer/{name}", Connection = "AzureWebJobsStorage")]
Stream myBlob,
string name,
ILogger log,
[Inject] DataContext myContext)
{
}
这是运行该函数时抛出的错误
[2/20/2019 4:25:10 AM]错误索引方法'MessagesToSqlDbFuncApp'[2/20/2019 4:25:10 AM] Microsoft.Azure.WebJobs.Host:错误索引方法'BlobQCMessagesToSqlDbFuncApp'。 Microsoft.Azure.WebJobs.Host:无法将参数'myContext'绑定到DataContext类型。确保绑定支持参数Type。如果您正在使用绑定扩展(例如Azure存储,ServiceBus,计时器等),请确保已在启动代码中调用扩展的注册方法(例如builder.AddAzureStorage(),builder.AddServiceBus( ),builder.AddTimers()等)。
这是nuget包和版本
重要说明:调试器没有达到Startup
类!如何初始化startup
类?
假设您使用包Willezone.Azure.WebJobs.Extensions.DependencyInjection
,右键单击您的函数项目Edit <functionProject>.csproj
,并将TargetFramework从netcoreapp2.1更改为netstandard2.0。
<TargetFramework>netstandard2.0</TargetFramework>
存在不一致是因为非官方软件包没有赶上功能SDK中的更改,official guidance正在进行中。
添加此支持的大多数核心部分都已完成。完成最后一个SDK项目后,我们将能够更好地提供ETA。
启动类和azure函数存在问题。见Azure function Publish not creating Startup class entry in extensions.json
其中一些问题是目前产品的已知限制。我们正在为Azure功能中面向客户的DI功能提供一流的支持,该功能将提供一整套文档,包括您可以依赖的服务和官方指导。
一种解决方案是使用IExtensionConfigProvider
(参见Azure Function run code on startup)
我个人最后使用静态构造函数进行初始化并使用azure函数作为简单对象,如下所述:Integrating Simple Injector in Azure Functions
编辑25/02/2019
包Microsoft.Azure.WebJobs.Script.ExtensionsMetadataGenerator的1.0.2版修复了extensions.json中的绑定问题。 Microsoft.NET.Sdk.Functions应尽快包含最新版本的ExtensionsMetadataGenerator。