You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查看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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 11:20:14