gpt4 book ai didi

c# - 为什么我的 EF Core DbContext 不受 DI 绑定(bind)?

转载 作者:行者123 更新时间:2023-12-03 21:03:19 25 4
gpt4 key购买 nike

我有一个 Azure 函数应用程序,其函数在 blob 触发器上运行。我已经证明这个函数可以通过 Azure 门户运行并响应这个 blob 触发器而不会出现问题......或者至少是这样。

现在我已经添加了使用 EF Core (2.2.4) 的功能,在本地调试和发布到 Azure 时都会出现以下错误:

Microsoft.Azure.WebJobs.Host: Error indexing method 'ParseThings'. Microsoft.Azure.WebJobs.Host: Cannot bind parameter 'context' to type AvastusContext. Make sure the parameter Type is supported by the binding. If you're using binding extensions (e.g. Azure Storage, ServiceBus, Timers, etc.) make sure you've called the registration method for the extension(s) in your startup code (e.g. builder.AddAzureStorage(), builder.AddServiceBus(), builder.AddTimers(), etc.).

按照 Azure Function App 文档 here 的指示,我有一个 Startup 类,并严格遵循他们的示例,除了以下行代替其配置的示例服务之外:

[assembly: FunctionsStartup(typeof(AvstFunctionApp.Startup))]

namespace AvstFunctionApp
{
public class Startup : FunctionsStartup
{
public override void Configure(IFunctionsHostBuilder builder)
{
builder.Services.AddDbContext<AvastusContext>(options => options.UseSqlServer(Environment.GetEnvironmentVariable("AvastusDb")));
}
}
}

我的函数的开始:

public static class ParseThings
{
[FunctionName("ParseThings")]
public static void Run([BlobTrigger("summaries/{name}", Connection = "StorageConnectionString")]Stream myBlob, string name, ILogger log, AvastusContext context)

我可以确认 AddDbContext正在在调试器中被命中,所以大概这里幕后发生了一些错误,或者我正在做一些非常愚蠢的事情.

我尝试过但不起作用的事情包括:

  • .BuildServiceProvider(true) 添加到 AddDbContext
  • 使用 WebJobsStartup 而不是最近公布的 FunctionsStartup
  • 降级到 .NET Core 2.2.0
  • 将 Function 类和 Run 方法从静态更改为实例
  • 修复注入(inject)的 AvastusContext 的错误命名空间

还值得注意的是,这个 Function App 项目中还有两个函数似乎没有任何严重问题,并且我已经能够使用 EF Core 的类似方法来实现另一个函数的依赖注入(inject)(此解决方案中的 ASP.NET Core MVC) 项目。

预先感谢您提供的任何帮助!

附注我觉得非常奇怪的是,互联网上没有任何关于 .NET Core、Azure Function Apps 和 EF Core 更高版本的描述这种情况的信息,这让我相信这可能是一个简单的错误。希望不是。

最佳答案

也许一种解决方案是您可以尝试在函数中注入(inject) IServiceProvider 而不是 AvastusContext,就像我在下面的存储库类中注入(inject)的那样:

private readonly IServiceProvider serviceProvider;

public SomeRepository(IServiceProvider serviceProvider)
{
this.serviceProvider = serviceProvider;
}

using var context = this.serviceProvider.GetService<XYZDBContext>();

这将为您提供一个上下文对象。另外,不知道为什么您要尝试直接访问函数中的上下文,以实现定义上下文类的良好实践,并维护存储库以在代码中执行任何 CRUD 操作。

Startup.cs 您可以添加额外的配置,例如:

builder.Services.AddDbContext<XYZDBContext>(
options =>
{
options.UseSqlServer(
conn,
sqlServerOptionsAction:
sqlOptions =>
{
sqlOptions.EnableRetryOnFailure(maxRetryCount: 3, maxRetryDelay: TimeSpan.FromSeconds(30), errorNumbersToAdd: null);
});
}, ServiceLifetime.Transient);

此配置在我当前的解决方案中运行得非常好。试试这个。

关于c# - 为什么我的 EF Core DbContext 不受 DI 绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56178561/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com