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

如何获取Autofac ContainerBuilder已注册类型以决定是否注册NetListener?

在Autofac中判断已注册类型是否包含指定特性

Autofac的ContainerBuilder本身并没有直接暴露已注册类型的公开集合,但你可以通过以下两种方式实现需求:

1. 手动跟踪注册的类型

在向ContainerBuilder注册类型时,同步维护一个自定义集合记录所有注册的类型,后续直接遍历这个集合检查特性即可。这种方式简单直接,适合在构建容器前判断是否需要注册NetListener。

示例代码:

// 初始化集合用于跟踪已注册类型
var registeredTypes = new List<Type>();

// 根据用户选择注册对应输入类
if (userSelectsNetworkInput)
{
    builder.RegisterType<InputOverNetwork>();
    registeredTypes.Add(typeof(InputOverNetwork));
}
else
{
    builder.RegisterType<InputFromLocal>();
    registeredTypes.Add(typeof(InputFromLocal));
}

// 检查是否存在带RequiresNetwork特性的类型
var requiresNetwork = registeredTypes.Any(t => 
    t.GetCustomAttributes(typeof(RequiresNetworkAttribute), inherit: true).Any());

// 按需注册NetListener
if (requiresNetwork)
{
    builder.RegisterType<NetListener>().SingleInstance();
}

2. 容器构建后从ComponentRegistry查询

如果允许在容器构建完成后再做判断,可以通过容器的ComponentRegistry获取所有已注册的服务类型,再检查特性。这种方式无需手动跟踪,但只能在容器构建后使用。

示例代码:

var container = builder.Build();

// 提取所有已注册的服务类型
var allRegisteredServices = container.ComponentRegistry.Registrations
    .SelectMany(reg => reg.Services)
    .OfType<TypedService>()
    .Select(svc => svc.ServiceType);

// 检查特性
var hasNetworkRequiredType = allRegisteredServices.Any(t => 
    t.GetCustomAttributes(typeof(RequiresNetworkAttribute), inherit: true).Any());

// 若需要,可从容器中获取NetListener(或提前注册好)
if (hasNetworkRequiredType)
{
    var netListener = container.Resolve<NetListener>();
    // 后续操作
}

总结

如果需要在注册NetListener之前完成判断,手动跟踪注册类型是最直接的方案;若可以延后到容器构建完成后,再用ComponentRegistry查询即可。

内容的提问来源于stack exchange,提问作者Saylent

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 18:58:33