Autofac 解析单一实例对象中的非单一实例对象

本文关键字:对象 单一 实例 Autofac | 更新日期: 2023-09-27 18:34:41

我的应用程序结构如下:

Web

服务器使用从客户端接收的 Web API Http 请求,到达 AppCoreLayer(Singleton(,然后从那里发送到首先使用 EF 代码的 DAL。

此外,在逻辑层和外部应用程序之间建立了 Tcp 连接。

在我的 DAL 中,我使用了一个 DbContext,我在 DI 容器 (Autofac( 中注册为 PerRequest。

我的问题是我很快就会收到来自外部应用程序的消息,并且需要执行一些数据库操作,但我无法理解 DbContext 将以这种方式实例化。

我已经读到注册对象PerMatchingLifetimeScope有助于不支持请求的外部应用程序,但我不明白这是否以及如何帮助我。很想解释一下。

谢谢

Autofac 解析单一实例对象中的非单一实例对象

在默认关系中,AppCoreLayer 需要 DbContext。但在您的情况下,AppCoreLayer 需要创建 DbContext。您可以使用动态实例化轻松完成此操作。

使用自动生成的工厂可以让你有效地调用 Resolve(( 而不将组件绑定到 Autofac。使用这个 关系类型(如果需要创建多个实例( 给定的服务,或者如果您不确定是否需要服务 并希望在运行时做出决定。

但是,如果您的DbContext注册为 InstancePerRequest则应自行解析 DbContext。因为单一实例对象在根生存期内解析,但每个请求具有不同的生存期范围。

因此,您可以使用ILifeTimeScopeDependencyResolver来解决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>());
        }

还要检查这个。