Autofac 解析单一实例对象中的非单一实例对象
本文关键字:对象 单一 实例 Autofac | 更新日期: 2023-09-27 18:34:41
我的应用程序结构如下:
Web服务器使用从客户端接收的 Web API Http 请求,到达 AppCoreLayer(Singleton(,然后从那里发送到首先使用 EF 代码的 DAL。
此外,在逻辑层和外部应用程序之间建立了 Tcp 连接。
在我的 DAL 中,我使用了一个 DbContext,我在 DI 容器 (Autofac( 中注册为 PerRequest。
我的问题是我很快就会收到来自外部应用程序的消息,并且需要执行一些数据库操作,但我无法理解 DbContext 将以这种方式实例化。
我已经读到注册对象PerMatchingLifetimeScope有助于不支持请求的外部应用程序,但我不明白这是否以及如何帮助我。很想解释一下。
谢谢
在默认关系中,AppCoreLayer 需要 DbContext。但在您的情况下,AppCoreLayer 需要创建 DbContext。您可以使用动态实例化轻松完成此操作。
使用自动生成的工厂可以让你有效地调用 Resolve(( 而不将组件绑定到 Autofac。使用这个 关系类型(如果需要创建多个实例( 给定的服务,或者如果您不确定是否需要服务 并希望在运行时做出决定。
但是,如果您的DbContext
注册为 InstancePerRequest
则应自行解析 DbContext。因为单一实例对象在根生存期内解析,但每个请求具有不同的生存期范围。
因此,您可以使用ILifeTimeScope
或DependencyResolver
来解决DbContext
。下面是一个示例:
public Func<T> HttpRequestScopedFactoryFor<T>()
{
return () => DependencyResolver.Current.GetService<T>();
}
protected override void Load(ContainerBuilder builder)
{
builder.RegisterType(typeof(DerivedDbContext)).AsSelf().InstancePerRequest();
builder.RegisterInstance(HttpRequestScopedFactoryFor<DerivedDbContext>());
}
还要检查这个。