如何在 Autofac 中使用程序集扫描注册多个具体类型?

How do I register multiple concrete types using assembly scanning in Autofac?

我有一个包含多个 类 的程序集,我想在 Autofac 中使用程序集扫描进行注册。一些要求:

根据文档,执行此操作的直接方法似乎如下所示。请注意,Module 实现在这里无关紧要;我只是为了完整性而展示它)。

ContainerBuilder builder;
// ...
builder.RegisterAssemblyTypes(_assembly).AssignableTo<ExpandableDialog>();
builder.RegisterAssemblyTypes(_assembly).AssignableTo<Form>();

这是否会导致每行进行汇编扫描?或者我可以通过像这样组合它们来提高性能吗?

ContainerBuilder builder;
// ...
builder.RegisterAssemblyTypes(_assembly)
    .AssignableTo<ExpandableDialog>()
    .AssignableTo<Form>();

我觉得最下面那个不对,因为AssignableTo使用了逻辑AND,所以需要类来实现both类 以上是错误的。应该是OR条件。

根据我上面的要求列表,正确的解决方案是什么?

一般来说注册都是一次性的,我觉得在大多数情况下你不应该太在意一次性的性能。同样基于 docs 描述,第二个应该只注册可分配给 FormExpandableDialog 的类型。

如果您担心多次扫描,您可以将 Where 与谓词一起使用:

builder.RegisterAssemblyTypes(_assembly)
    .Where(t => t.IsAssignableTo<ExpandableDialog>() || t.IsAssignableTo<Form>())
    .AsSelf();