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

如何用Autofac动态注册类并通过类名字符串解析实例

Autofac动态按类名字符串解析子类实例实现方案

核心思路

注册所有AbstractBaseClass的子类时,将类名作为服务注册名称,绑定到AbstractBaseClass服务类型上,后续即可通过类名字符串调用ResolveNamed方法动态解析实例。

注册代码修改

将原有注册逻辑补充命名规则,确保每个子类以自身类名作为注册标识:

var builder = new ContainerBuilder();
// 获取目标类库程序集(根据实际场景调整获取方式)
var libraryAssembly = typeof(AbstractBaseClass).Assembly;

// 注册所有非抽象的子类,以类名作为注册名称
builder.RegisterAssemblyTypes(libraryAssembly)
       .Where(t => t.IsSubclassOf(typeof(AbstractBaseClass)) && !t.IsAbstract)
       .Named(t => t.Name, typeof(AbstractBaseClass));

var container = builder.Build();

动态解析实现

通过类名字符串调用ResolveNamed方法获取实例,返回类型为AbstractBaseClass,可按需转换为具体子类:

// 传入要解析的类名字符串
string targetClassName = "NewClass1";
AbstractBaseClass instance = container.ResolveNamed<AbstractBaseClass>(targetClassName);

// 转换为具体子类类型(可选)
if (instance is NewClass1 specificInstance)
{
    // 执行子类专属逻辑
}

扩展说明

  • 若需自定义注册名称而非类名,可给子类添加自定义特性(如[ComponentName("CustomName")]),注册时通过反射读取特性值作为名称
  • 若要批量获取所有已注册的子类名称,可通过以下方式遍历:
var registeredNames = container.ComponentRegistry
                               .RegistrationsFor(new TypedService(typeof(AbstractBaseClass)))
                               .SelectMany(r => r.Services.OfType<KeyedService>())
                               .Select(ks => ks.Key.ToString())
                               .ToList();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 10:07:12