C# Autofac解析Singleton对象中的非Singleton对象

C# Autofac解析Singleton对象中的非Singleton对象,c#,entity-framework,dependency-injection,autofac,C#,Entity Framework,Dependency Injection,Autofac,我的申请结构如下: Web服务器使用从客户端接收的Web Api Http请求,到达AppCoreLayer(Singleton),然后从那里发送到DAL,DAL首先使用EF代码 此外,在逻辑层和外部应用程序之间建立Tcp连接 在我的DAL中,我使用一个DbContext,在我的DI容器(Autofac)中注册为PerRequest 我这里的问题是,我很快就会收到来自外部应用程序的消息,并且需要执行一些db操作,但我无法理解如何以这种方式实例化DbContext 我已经读过register th

我的申请结构如下:

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

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

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

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

我已经读过register the objects Permatching LifetimeScope有助于处理不支持请求的外部应用程序,但我不知道这是否以及如何帮助我。我想解释一下


感谢默认关系中的AppCoreLayer需要DbContext。但在您的情况下,AppCoreLayer需要创建DbContext。您可以使用

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

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

因此,您可以使用
ILifeTimeScope
dependencysolver
解析
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>());
        }
公共函数HttpRequestScopedFactoryFor() { return()=>DependencyResolver.Current.GetService(); } 受保护的覆盖无效负载(ContainerBuilder builder) { builder.RegisterType(typeof(DerivedDbContext)).AsSelf().InstancePerRequest(); RegisterInstance(HttpRequestScopedFactoryFor()); }
同时检查。

我有一个问题,我的逻辑层必须是单态的,然后你就不能使用了。因为,逻辑层相关对象也应该是单例对象。您应该使用
InstancePerLifetimeScope
它比每个请求的范围更宽。这意味着,如果dbcontext是通过请求创建的,那么它将随请求一起处理。但是,如果它是由singleton对象创建的,那么它也将是singleton,并且与这个对象(您的逻辑层)一起生活。如果您的dbcontext只是依赖于您的逻辑层,那么您也可以将其设置为单实例。我所有的应用程序都是单例的。。如果我将LogicLayer注册为PerScope,它会为每个请求再次实例化吗?是的,你是对的,你不应该使用它。我现在明白你的问题了。我已经编辑了你的问题和我的答案。