- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
编辑::已使用显示实际服务的扩展方法更新了代码片段
我有一个Web api项目和一个独立的函数项目。两者几乎都使用相同的 DI,以至于我为 DI 加载提取了一些扩展方法。
我的函数是由服务总线消息触发的。如果我在本地调试并向总线发送消息,我可以 100% 处理它。如果我部署该函数然后向总线发送消息,那么它会因 DependencyInjection 错误而终止,无法实例化我的类。
这是我的消息监听函数。
public class ProcessingAnalyseDocumentsConsumer {
private readonly ILogger<ProcessingAnalyseDocumentsConsumer> _logger;
private readonly FormRecogniserService _formRecogniserService;
private readonly ReprocessEncounterService _reprocessEncounterService;
private readonly DataContext _context;
public ProcessingAnalyseDocumentsConsumer(
ILogger<ProcessingAnalyseDocumentsConsumer> logger,
FormRecogniserService formRecogniserService,
ReprocessEncounterService reprocessEncounterService,
DataContext context) {
_logger = logger;
_formRecogniserService = formRecogniserService;
_reprocessEncounterService = reprocessEncounterService;
_context = context;
}
[Function("ProcessingAnalyseDocumentsConsumer")]
public async Task RunAsync(
[ServiceBusTrigger(Constants.QUEUES_PROCESSING_ANALYSIS_DOCUMENTS, Connection = "ServiceBusConnection")]
ReprocessSingleDoc message) {
_logger.LogInformation($"C# ServiceBus queue trigger function processed message: {JsonConvert.SerializeObject(message)}");
var item = _context.LocationCities.FirstOrDefault();
_logger.LogInformation($"Found item in db: {JsonConvert.SerializeObject(item)}");
}
}
我的函数的 Program.cs 如下所示
var host = new HostBuilder()
.ConfigureFunctionsWorkerDefaults()
.ConfigureServices(async (hostContext, services) => {
var configuration = hostContext.Configuration;
var connectionString = configuration["DefaultConnection"];
var env = hostContext.HostingEnvironment;
services.AddDbContext<DataContext>(dbContextOptions =>
dbContextOptions
.UseLazyLoadingProxies()
.UseSqlServer(
connectionString,
b => b.MigrationsAssembly("WEBAPIPROJECTASSEMBLY"))
);
if (!env.IsDevelopment()) {
services.AddAzureClients(azureClientFactoryBuilder => {
azureClientFactoryBuilder.AddSecretClient(configuration.GetSection("KeyVault"));
});
Console.WriteLine("adding azure vault");
services.AddSingleton<IKeyVaultService, KeyVaultService>();
}
else {
Console.WriteLine("adding debug vault");
services.AddSingleton<IKeyVaultService, DebugKeyVaultService>();
}
await services.AddSensitiveServicesAsync(); //extension methods to add services
services.AddHttpContextAccessor(); //make http context available
services.ServiceDependencies(); //extension methods to add services
});
await host.Build().RunAsync();
以下是正在调用的扩展方法。
public static async Task<IServiceCollection> AddSensitiveServicesAsync(this IServiceCollection services) {
var serviceProvider = services.BuildServiceProvider();
var keyVault = serviceProvider.GetService<IKeyVaultService>();
if (keyVault == null) {
throw new NullReferenceException(nameof(keyVault));
}
await services.AddBlobStorage(keyVault);
await services.AddFormRecogniserService(keyVault);
return services;
}
public static async Task<IServiceCollection> AddBlobStorage(
this IServiceCollection services,
IKeyVaultService keyVault) {
var blobStorageConnectionString = await keyVault.GetSecret("blob-storage-connection");
services.AddTransient(t => new BlobStorageService(blobStorageConnectionString));
return services;
}
public static async Task<IServiceCollection> AddFormRecogniserService(
this IServiceCollection services,
IKeyVaultService keyVault) {
var secret_key = await keyVault.GetSecret("form-recogniser-key");
var secret_endpoint = await keyVault.GetSecret("form-recogniser-endpoint");
var serviceProvider = services.BuildServiceProvider();
var blobStorage = serviceProvider.GetService<BlobStorageService>();
if (blobStorage == null) {
throw new NullReferenceException(nameof(blobStorage));
}
services.AddTransient(t => new FormRecogniserService(secret_key, secret_endpoint, blobStorage));
return services;
}
唯一复杂的事情是我创建了一个用于调试的调试 keystore 并进行了环境切换 - 但这在本地有效,当我删除它时 - 一切仍然中断。我的 blob 存储服务和表单识别器服务也是使用从 keyvault 检索到的 secret 构建的,因此它们是异步的。但我认为这不会引起任何问题 - 它在本地和我的其他项目中都有效。
无论我注入(inject)的第一个自定义服务是什么,Azure 上的依赖注入(inject)总是失败。我改变了服务,调换了它们等等,无论我要求什么,它都没有启动。如果我从构造函数中删除任何自定义服务并只保留记录器,一切都会正常工作。调试时,自定义服务在本地 webapi 项目、azure 以及本地函数项目中 100% 工作。
Result: Failure Exception: System.InvalidOperationException: Unable to resolve service for type 'medimore_azure.FormRecogniserService' while attempting to activate 'medimore_azure_functions.Messaging.ProcessingAnalyseDocumentsConsumer'. at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.ConstructorMatcher.CreateInstance(IServiceProvider provider) at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.CreateInstance(IServiceProvider provider, Type instanceType, Object[] parameters) at Microsoft.Azure.Functions.Worker.DefaultFunctionActivator.CreateInstance(Type instanceType, FunctionContext context) in D:\a_work\1\s\src\DotNetWorker.Core\Invocation\DefaultFunctionActivator.cs:line 23 at Microsoft.Azure.Functions.Worker.Invocation.DefaultFunctionInvoker
2.CreateInstance(FunctionContext context) in D:\a\_work\1\s\src\DotNetWorker.Core\Invocation\DefaultFunctionInvoker.cs:line 26 at Microsoft.Azure.Functions.Worker.Invocation.DefaultFunctionExecutor.ExecuteAsync(FunctionContext context) in D:\a\_work\1\s\src\DotNetWorker.Core\Invocation\DefaultFunctionExecutor.cs:line 30 at Microsoft.Azure.Functions.Worker.OutputBindings.OutputBindingsMiddleware.Invoke(FunctionContext context, FunctionExecutionDelegate next) in D:\a\_work\1\s\src\DotNetWorker.Core\OutputBindings\OutputBindingsMiddleware.cs:line 13 at Microsoft.Azure.Functions.Worker.FunctionsApplication.InvokeFunctionAsync(FunctionContext context) in D:\a\_work\1\s\src\DotNetWorker.Core\FunctionsApplication.cs:line 77 at Microsoft.Azure.Functions.Worker.Handlers.InvocationHandler.InvokeAsync(InvocationRequest request) in D:\a\_work\1\s\src\DotNetWorker.Grpc\Handlers\InvocationHandler.cs:line 88 Stack: at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.ConstructorMatcher.CreateInstance(IServiceProvider provider) at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.CreateInstance(IServiceProvider provider, Type instanceType, Object[] parameters) at Microsoft.Azure.Functions.Worker.DefaultFunctionActivator.CreateInstance(Type instanceType, FunctionContext context) in D:\a\_work\1\s\src\DotNetWorker.Core\Invocation\DefaultFunctionActivator.cs:line 23 at Microsoft.Azure.Functions.Worker.Invocation.DefaultFunctionInvoker
2.CreateInstance(FunctionContext context) in D:\a_work\1\s\src\DotNetWorker.Core\Invocation\DefaultFunctionInvoker.cs:line 26 at Microsoft.Azure.Functions.Worker.Invocation.DefaultFunctionExecutor.ExecuteAsync(FunctionContext context) in D:\a_work\1\s\src\DotNetWorker.Core\Invocation\DefaultFunctionExecutor.cs:line 30 at Microsoft.Azure.Functions.Worker.OutputBindings.OutputBindingsMiddleware.Invoke(FunctionContext context, FunctionExecutionDelegate next) in D:\a_work\1\s\src\DotNetWorker.Core\OutputBindings\OutputBindingsMiddleware.cs:line 13 at Microsoft.Azure.Functions.Worker.FunctionsApplication.InvokeFunctionAsync(FunctionContext context) in D:\a_work\1\s\src\DotNetWorker.Core\FunctionsApplication.cs:line 77 at Microsoft.Azure.Functions.Worker.Handlers.InvocationHandler.InvokeAsync(InvocationRequest request) in D:\a_work\1\s\src\DotNetWorker.Grpc\Handlers\InvocationHandler.cs:line 88
最佳答案
正如 @Steven 所说,“在配置容器的过程中调用 BuildServiceProvider 通常不是一个好主意”。它可以在本地运行,但在部署时会崩溃。重构了很多配置部分,因为我删除了 BuildServiceProvider 调用,所以它按预期工作。
关于azure - .net 7 隔离的 Azure 函数依赖注入(inject)在部署时失败(在本地工作),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77151093/
我在 gobject 上阅读了一个维基百科页面,上面写着, Depending only on GLib and libc, GObject is a cornerstone of GNOME and
如何注册一个依赖属性,其值是使用另一个依赖属性的值计算的? 由于 .NET 属性包装器在运行时被 WPF 绕过,因此不应在 getter 和 setter 中包含逻辑。解决方案通常是使用 Proper
我一直在尝试将 ActionbarSherlock maven 依赖项添加到我的项目中 com.actionbarsherlock library 4.2.0 在我的 po
http://tutorials.jenkov.com/ood/understanding-dependencies.html#whatis说(强调我的): Whenever a class A us
我对所有这些魔法有点不清楚。 据我了解,依赖属性是从 DependencyObject 继承的,因此存储值: 如果分配了值(在本地字典中),则在实例本身中 或者如果未指定值,则从指向父元素的链接中获取
我刚刚更新了在 ASP.NET Framework 4.5.2 版上运行的 MVC Web 应用程序。我正在使用 Twilio 发送 SMS 消息: var twilio = new TwilioRe
我刚刚发现了一件令人生畏的事情。 spring 依赖坐标有两个版本。 项目依赖于 spring mvc 和 spring flow。有两组并行的依赖项。 Spring MVC 具有以下方案的依赖项
我正在尝试包含 的 maven 依赖项 org.jacorb jacorb 2.3.1 依赖已解决,但它导致另一个依赖 picocontainer 出现问题: [ERROR
我正在尝试在 Haskell 项目中包含特定版本的库。该库是住宿加早餐型的(用于 martix 操作),但我需要特定的 0.4.3 版本,该版本修复了乘法实现的错误。 所以,我的 stack.yaml
有谁知道如何制作依赖的 UIPickerView.例如,当我选择组件一的第 2 行时,组件二的标题会发生变化吗? 我在互联网上查找过,没有真正的答案,我尝试过使用 if 和 switch 语句,但它们
我正在编写一个用于验收测试的项目,由于各种原因,这依赖于另一个打包为 WAR 的项目。我已成功使用 maven-dependency-plugin 解压 WAR,但无法让我的项目包含解压的 WEB-I
或多或少我在 session 上大量构建我的网站(特别是重定向用户等),我很好奇这是否是一种危险的做法。禁用浏览器 cookie 保存的用户的大致比例是多少?我愿意接受任何建议:) 谢谢 最佳答案 s
开始玩 Scala futures,我被依赖的 futures 困住了。 让我们举个例子。我搜索地点并获得 Future[Seq[Place]]。对于这些地点中的每一个,我搜索最近的地铁站(该服务返回
或多或少我在 session 上大量构建我的网站(特别是重定向用户等),我很好奇这是否是一种危险的做法。禁用浏览器 cookie 保存的用户的大致比例是多少?我愿意接受任何建议:) 谢谢 最佳答案 s
我有一个二进制文件,需要一些 *.so 文件才能执行。现在,当我尝试在一些旧机器上执行它时,它会显示 /lib/libc.so.6: version `GLIBC_2.4' not found 如何将
我尝试使用 Dygraph 来表示图表,我在 https://github.com/danvk/dygraphs 中找到了代码,但是它有太多的依赖文件,我觉得很烦人。是否有一个文件可以容纳所有必需的
我正在处理一个 javascript 文件,该文件 a) 声明一个具有函数的对象,并且 b) 使用它期望在外部声明的散列调用该对象的 init 函数。我的 Jasmine 规范提示它找不到哈希,因为它
最近我一直在学习 Angular 并且进展顺利,但是关于依赖注入(inject)的一些事情我仍然不清楚。 是否有任何理由在我的 app.js 文件中声明我的应用程序的其他部分(服务、 Controll
考虑一个名为 foo 的表,它有 id (PRIMARY & AUTO_INCREMENT) 列。我正在向该表中插入一行,挑战从此时开始。 $db->query("INSERT INTO `foo`
我正在使用级联下拉 jquery 插件。 (https://github.com/dnasir/jquery-cascading-dropdown) 我有两个下拉菜单。 “客户端”和“站点”。 根据您
我是一名优秀的程序员,十分优秀!