如何在Autofac中通过程序集扫描注册多个具体类型?
问题解答
前置疑问解答
- 关于重复扫描:两次独立调用
RegisterAssemblyTypes(_assembly)确实会分别触发一次完整的程序集全类型扫描,存在不必要的性能开销,程序集包含的类型越多,冗余开销越明显。 - 关于链式
AssignableTo的逻辑:你的判断完全正确,多个AssignableTo过滤条件是逻辑与的关系,仅会匹配同时继承两个基类的类型,无法满足「匹配任一基类」的需求。
正确实现方案
最优实现方式是在单次扫描中通过自定义Where条件完成OR逻辑匹配,仅触发一次程序集扫描,同时满足所有需求:
ContainerBuilder builder; // ... builder.RegisterAssemblyTypes(_assembly) .Where(type => // 匹配任一基类的继承关系即可 typeof(ExpandableDialog).IsAssignableFrom(type) || typeof(Form).IsAssignableFrom(type) );
补充说明
- Autofac的
RegisterAssemblyTypes默认已经自动过滤抽象类、接口、静态类,不需要额外添加排除抽象类的逻辑,如果你需要显式强化校验,可以在Where条件中追加&& !type.IsAbstract规则。 - 如果你需要为两类类型配置不同的注册生命周期、服务暴露规则,可以在Where过滤后追加
If条件分支配置,依然不需要重复扫描程序集,示例如下:
builder.RegisterAssemblyTypes(_assembly) .Where(type => typeof(ExpandableDialog).IsAssignableFrom(type) || typeof(Form).IsAssignableFrom(type) ) // 为ExpandableDialog子类配置独立注册规则 .If(t => typeof(ExpandableDialog).IsAssignableFrom(t), reg => reg.InstancePerDependency().As<ExpandableDialog>() ) // 为Form子类配置独立注册规则 .If(t => typeof(Form).IsAssignableFrom(t), reg => reg.SingleInstance().As<Form>() );
内容的提问来源于stack exchange,提问作者void.pointer
相关产品推荐
相关产品推荐

