如何在 Autofac 中使用程序集扫描注册多个具体类型?
How do I register multiple concrete types using assembly scanning in Autofac?
我有一个包含多个 类 的程序集,我想在 Autofac 中使用程序集扫描进行注册。一些要求:
- 我使用不止一种基类型来查找要注册的具体类型。
- 不应该注册
abstract
类.
- 如果可能,扫描不应该wasteful/redundant。
根据文档,执行此操作的直接方法似乎如下所示。请注意,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 描述,第二个应该只注册可分配给 Form
和 ExpandableDialog
的类型。
如果您担心多次扫描,您可以将 Where
与谓词一起使用:
builder.RegisterAssemblyTypes(_assembly)
.Where(t => t.IsAssignableTo<ExpandableDialog>() || t.IsAssignableTo<Form>())
.AsSelf();
我有一个包含多个 类 的程序集,我想在 Autofac 中使用程序集扫描进行注册。一些要求:
- 我使用不止一种基类型来查找要注册的具体类型。
- 不应该注册
abstract
类. - 如果可能,扫描不应该wasteful/redundant。
根据文档,执行此操作的直接方法似乎如下所示。请注意,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 描述,第二个应该只注册可分配给 Form
和 ExpandableDialog
的类型。
如果您担心多次扫描,您可以将 Where
与谓词一起使用:
builder.RegisterAssemblyTypes(_assembly)
.Where(t => t.IsAssignableTo<ExpandableDialog>() || t.IsAssignableTo<Form>())
.AsSelf();