如何用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
相关产品推荐
相关产品推荐

