C# Autofac解析Singleton对象中的非Singleton对象
我的申请结构如下: Web服务器使用从客户端接收的Web Api Http请求,到达AppCoreLayer(Singleton),然后从那里发送到DAL,DAL首先使用EF代码 此外,在逻辑层和外部应用程序之间建立Tcp连接 在我的DAL中,我使用一个DbContext,在我的DI容器(Autofac)中注册为PerRequest 我这里的问题是,我很快就会收到来自外部应用程序的消息,并且需要执行一些db操作,但我无法理解如何以这种方式实例化DbContext 我已经读过register the objects Permatching LifetimeScope有助于处理不支持请求的外部应用程序,但我不知道这是否以及如何帮助我。我想解释一下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
感谢默认关系中的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,它会为每个请求再次实例化吗?是的,你是对的,你不应该使用它。我现在明白你的问题了。我已经编辑了你的问题和我的答案。