如何查看Autofac管理的所有实例及统计指定类型实例数量?
在Autofac中查看管理的全部实例及统计指定类型实例数量
Autofac没有直接提供“列出所有实例”的开箱即用功能,因为它对不同生命周期实例的管理逻辑不同:瞬态实例创建后不会被容器保留引用,无法追踪;而单例、作用域绑定的实例会被容器/作用域跟踪,可通过以下方式处理。
一、查看Autofac管理的全部跟踪实例
仅能获取容器主动跟踪的实例(单例、InstancePerLifetimeScope等生命周期绑定类型),瞬态实例无法捕获。可以通过遍历容器及所有子作用域的跟踪集合实现:
public static IEnumerable<object> GetAllTrackedInstances(ILifetimeScope scope) { // 获取当前作用域的跟踪实例 foreach (var instance in scope.Lifetime.TrackedInstances) { yield return instance; } // 递归遍历所有子作用域 foreach (var childRegistration in scope.ComponentRegistry.RegistrationsFor(new TypedService(typeof(ILifetimeScope)))) { if (childRegistration.Activator.LimitType == typeof(LifetimeScope)) { var childScope = (ILifetimeScope)childRegistration.Activator.ActivateInstance(scope, Enumerable.Empty<Parameter>()); foreach (var instance in GetAllTrackedInstances(childScope)) { yield return instance; } } } }
调用示例:
// 假设container是你的根容器实例 var allTrackedInstances = GetAllTrackedInstances(container).ToList();
二、统计指定类型的实例数量
以你的示例containerBuilder.RegisterType<MyService>().As<IMyService>()为例,分场景处理:
1. 统计单例实例数量
如果注册时标记为单例(SingleInstance()),实例数量最多为1:
public static int CountSingletonInstances<TService>(IContainer container) { if (container.ComponentRegistry.TryGetRegistration(new TypedService(typeof(TService)), out var registration) && registration.Lifetime is RootScopeLifetime) { try { // 尝试解析实例,若成功说明已创建 container.Resolve<TService>(); return 1; } catch (DependencyResolutionException) { // 实例尚未被创建 return 0; } } return 0; }
2. 统计所有跟踪的指定类型实例(含作用域内)
结合前面的遍历方法,过滤出目标类型的实例:
public static int CountTrackedInstancesOfType<TService>(ILifetimeScope scope) { var allTracked = GetAllTrackedInstances(scope); return allTracked.Count(instance => typeof(TService).IsAssignableFrom(instance.GetType())); }
调用示例:
// 统计根容器及所有子作用域中的IMyService实例数量 int myServiceCount = CountTrackedInstancesOfType<IMyService>(container);
注意事项
- 瞬态实例:容器不跟踪这类实例,无法统计,若需要需自行在创建逻辑中添加记录
- 服务类型匹配:如果注册时使用
AsImplementedInterfaces()等批量映射方式,需确保过滤逻辑考虑实现类与服务接口的兼容性 - 嵌套作用域:若使用了请求作用域、自定义嵌套作用域,需确保遍历逻辑覆盖到所有相关作用域
内容的提问来源于stack exchange,提问作者srk
相关产品推荐
相关产品推荐

