首页 > 解决方案 > 为什么 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 注入这种特殊的依赖关系?

标签: lamar

解决方案


我遇到了同样的问题,我发现IServiceScopeFactory在我的情况下,在管理 HangFireSession 时使用。因此,更改IServiceScopeFactoryIServiceProvider并从中创建范围解决了我的问题。

解决方案1: IServiceScopeFactoryIServiceProvider完全一样。

这是 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


推荐阅读