因此,如果具体注册类型有多个候选,Autofac 允许我们选择要使用的构造函数。解释如下 - https://autofac.readthedocs.io/en/latest/advanced/constructor-selection.html#iconstructorselector
但是,如果我想对每个注册(数百个Autofac.Module
类中的数千个注册)使用自定义构造函数选择器,该怎么办?如何在不明确自定义每个注册的情况下更改默认设置?
动机
我们有一个非常大的 .NET Framework 应用程序,使用 MEF 作为 IoC。在迁移到 .NET Core 之前,我们希望将其替换为 Autofac,作为初步步骤。
有 Autofac.Mef,但它不支持 Lazy 或开放泛型注入,根据此处的文档 - https://autofac.readthedocs.io/en/latest/integration/mef.html#known-issues-gotchas
因此我们将迁移到正确的 Autofac。我已经编写了检查创建的 MEF 容器并生成相应 Autofac 注册代码的代码。但有一个问题 - 如果 Autofac 选择的构造函数与 MEF 不同怎么办?即不是归因于的那个[ImportingConstructor]
?
因此,我希望能够自定义注册代码以尊重属性,至少目前如此,以降低回归风险。当然,既然代码无论如何都会生成,我可以修改每个注册。但我想知道是否有更好的方法。
确实没有什么好办法来做到这一点。
很多挑战在于所使用的构建器语法/回调的组合以及 Autofac 通过注册源等概念提供的动态特性。
当您注册某些东西(例如
RegisterType<T>()
)时,它会向 中添加一个回调函数ContainerBuilder
。整个链式注册函数集在最后执行,在Build()
它构建一个回调到回调到回调的中间件链,最终构建一个完整的对象注册。没有真正的地方可以“全局拦截它们”。引入一些“全球性”的东西会产生一些不太容易解决的含义,这很大程度上就是为什么这样的事情不存在。
显然,快速添加一组选项是
ContainerBuilder
一件非常容易的事情。只是“改变全球行为”的连锁反应会带来很大的影响,所以我们没有这样做。话虽如此,如果这很有趣,我鼓励你打开一个问题并提出建议。如果你这样做,请确保包括我提到的所有影响深远的小部分的建议设计。团队规模很小,设计这样的新语言功能需要社区参与。(我们有一个针对全球的
IPropertySelector
类似请求的问题,但没有设计,也没有很好的解决方法。)附录:虽然我无法迭代解决方案,但我会这样说:
基于由于此 MEF 迁移而强制使用特定构造函数的目标,如果是我,我会去......
我知道这可能使问题变得微不足道,但从 MEF 迁移并不是零工作量,就像从 WCF 迁移到 ASP.NET Core 也不是零工作量一样。
但就像我说的 - 如果是我,我就会这样做。