C# 在Autofac中多次注册具有不同实例作用域的服务

C# 在Autofac中多次注册具有不同实例作用域的服务,c#,.net,dependency-injection,autofac,C#,.net,Dependency Injection,Autofac,我正在使用一个遗留代码库,它使用Autofac并将大量(如果不是全部)依赖项注册为PerRequest 我们正在开发新的功能,希望新的服务能够针对每个服务单独解决它们的依赖关系,而不是针对每个请求。初始服务由服务定位器通过Resolve获得 使用Autofac实现这一目标的最佳方式是什么 我相信键控服务在这里可能会有所帮助。下面是一个配置示例: builder.RegisterType<Impl>().As<IDependency>().InstancePerLifeti

我正在使用一个遗留代码库,它使用Autofac并将大量(如果不是全部)依赖项注册为PerRequest

我们正在开发新的功能,希望新的服务能够针对每个服务单独解决它们的依赖关系,而不是针对每个请求。初始服务由服务定位器通过Resolve获得

使用Autofac实现这一目标的最佳方式是什么

我相信键控服务在这里可能会有所帮助。下面是一个配置示例:

builder.RegisterType<Impl>().As<IDependency>().InstancePerLifetimeScope(); 
builder.RegisterType<Impl>().As<IDependency>().InstancePerDependency().Keyed<IDependency>("shinyNewService");       

builder.RegisterAssemblyTypes(newServiceAssembly).AsClosedTypesOf(newServiceInterface).WithParameter
                    (
                        new ResolvedParameter
                        (
                            (pi, ctx) => pi.ParameterType == typeof(IDependency),
                            (pi, ctx) => ctx.ResolveKeyed<IDependency>("shinyNewService")
                        )
                    );
builder.RegisterType();
builder.RegisterType().As().InstancePerDependence().Keyed(“shinyNewService”);
RegisterAssemblyTypes(NewServicesAssembly).AsClosedTypesOf(newServiceInterface).With参数
(
新解析参数
(
(pi,ctx)=>pi.ParameterType==typeof(IDependency),
(pi,ctx)=>ctx.resolvedkeyed(“shinyNewService”)
)
);
这对我来说似乎很管用,但是 我们还希望在每次调用Resolve时获得一个新的ShinyNewService实例,因此我认为将其配置为
InstancePerDependence
也是有意义的


有人对这种方法有什么建议吗?我也在考虑标记生存期范围,但没有想出一个完整的解决方案。欢迎任何意见,谢谢

可以找到解决方案,因为这会违反直觉,并且很难维护。对我来说,这看起来像是一场灾难。你能解释一下你为什么需要这种行为吗?当然。实际的依赖关系是一个工作单元(来自EF的dbContext),有些业务流程太复杂,不能被视为“web请求等于事务”。它们启动了单独的事务,有时我们希望在嵌套事务中编写一些内容,而不影响外部事务。对于您的工作单元使用
InstancePerLifetimeScope
,对于其他业务流程使用新的lifetimescope如何?这是解决这种情况的常用方法。我昨天尝试了一下,但没有想出一个完整的解决方案。然而,现在我想我们完全可以摆脱PerRequest配置,只需使用PerLifetimeScope即可。在通常请求的情况下,生存期范围将是一个web请求范围,Autofac会自动创建,对于我们的特殊情况,我们会创建其他嵌套范围。纸面上看起来不错,我明天试试。