Simple Injector嵌套作用域问题:如何从外部作用域获取依赖?
问题解答
1. 如何让DI容器从外部作用域获取依赖?
要让子作用域复用外部(父)作用域中的AppScopeService实例,最直接的方式是显式将父作用域的实例注入到子作用域中,覆盖子作用域内的默认注册逻辑:
代码示例
// 基础服务注册 var container = new Container(); container.RegisterSingleton<SingletonService>(); container.RegisterScoped<AppScopeService>(); container.RegisterScoped<InnerScopeService>(); container.Verify(); // 创建外部作用域 using (var appScope = container.BeginScope()) { // 从父作用域解析出要共享的AppScopeService实例 var parentAppService = appScope.GetInstance<AppScopeService>(); // 创建嵌套子作用域 using (var innerScope = container.BeginScope()) { // 在子作用域中注册父实例,覆盖默认的作用域注册 // 这样子作用域解析AppScopeService时会直接使用这个父作用域的实例 innerScope.RegisterInstance(parentAppService); // 此时解析InnerScopeService,其依赖的AppScopeService就是父作用域的实例 var innerService = innerScope.GetInstance<InnerScopeService>(); } }
如果希望AppScopeService始终绑定到最外层作用域,也可以通过自定义Lifestyle实现,但显式传递实例的方式更直观、易维护。
2. Simple Injector是否支持嵌套作用域?
Simple Injector完全支持嵌套作用域,默认的嵌套作用域具备以下特性:
- 子作用域可以访问父作用域中的单例服务
- 默认情况下,作用域服务会在当前作用域内创建实例,子作用域不会自动复用父作用域的作用域服务实例
- 子作用域独立隔离,内部的作用域服务实例会在子作用域释放时销毁,不影响父作用域的实例
你遇到的问题是默认行为导致的:子作用域解析InnerScopeService时,容器会在子作用域内创建它的依赖AppScopeService,而非复用父作用域实例——这是为了保证作用域服务的隔离性,避免意外的状态共享。
内容的提问来源于stack exchange,提问作者Evgenii Borisov
相关产品推荐
相关产品推荐

