lamar - 为什么 Lamar 不会在 ASP.NET Core 中注入 IServiceScopeFactory 类型?
问题描述
我正在尝试在 aspnetcore2.2 项目中实现健康检查,该项目断言我的 Lamar 容器配置是有效的IContainer.AssertConfigurationIsValid
(本质上它可以构造所有依赖项)。
一些服务(我无法控制)取决于Microsoft.Extensions.DependencyInjection.IServiceScopeFactory
. Lamar 无法注入任何这些依赖项,当这些服务无法构建时,断言失败。
该堆栈是一个 ASP.NET Core 2.2 应用程序,使用 Lamar 作为默认 IoC 框架(通过推荐的.UseLamar()
扩展方法),其他一切正常。
任何注射ServiceScopeFactory
(任何地方)都失败了
System.InvalidOperationException: Frame type Lamar.IoC.Resolvers.CastRootScopeFrame does not implement IResolverFrame
at Lamar.IoC.Instances.FuncResolverDefinition.BuildResolver()
at Lamar.IoC.Instances.GeneratedInstance.BuildFuncResolver(Scope scope)
at Lamar.IoC.Instances.GeneratedInstance.buildResolver(Scope scope)
at Lamar.IoC.Instances.GeneratedInstance.ToResolver(Scope topScope)
at Lamar.IoC.Instances.ConstructorInstance.ToResolver(Scope topScope)
at Lamar.ServiceGraph.FindResolver(Type serviceType)
at Lamar.IoC.Scope.TryGetInstance(Type serviceType)
at Lamar.IoC.Scope.GetService(Type serviceType)
(...)
为什么不能用 Lamar 注入这种特殊的依赖关系?
解决方案
我遇到了同样的问题,我发现IServiceScopeFactory
在我的情况下,在管理 HangFireSession 时使用。因此,更改IServiceScopeFactory
为IServiceProvider
并从中创建范围解决了我的问题。
解决方案1: IServiceScopeFactory
和IServiceProvider
完全一样。
这是 CreateScope from 的行为IServiceProvider
,它只是 wrap IServiceScopeFactory
。
public static IServiceScope CreateScope(this IServiceProvider provider)
{
return provider.GetRequiredService<IServiceScopeFactory>().CreateScope();
}
提交 PR 以重现错误https://github.com/JasperFx/lamar/pull/228
解决方案 2:注入 aFunc<IServiceScopeFactory>
而不是IServiceScopeFactory
推荐阅读
- vb.net - FlexGrid 树没有为整个网格创建节点
- git - git新手。测试分支不会与主分支合并,出现错误无法合并二进制文件
- javascript - 我可以将道具作为函数参数传递,或者这是一种不好的做法吗?
- firebase - Firebase Crashlytics 不会连接到同一项目中的辅助 Xamarin Android 应用程序
- php - 创建签名 url 以从 s3 存储桶获取文件时出错?
- android - PlacePicker 于 2019 年 11 月立即打开和关闭
- ubuntu - 无法在 Ubuntu 19.10 上启动设置(gnome-control-center)
- python - 使用现有 ODBC 配置凭据的 pyodbc 连接
- mysql - 从mysql中的另一个表创建用户名
- excel - 在将值与设置变量进行比较后,如何使此宏创建新工作表?