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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 01:54:06