缓存构造函数选择而不是 lamda 转换

Caching constructor selection instead of lamda conversion

我们的应用程序中出现了大量的 autofac 解决方案。我们一直有很长时间(大约 50% 的 Web 请求)处理属于 autofac 解析阶段。

我们注意到从指南切换到使用 Lambdas 注册常用组件是多么重要,我们的测试表明它可以为我们带来极大的收益。 从此转换

builder.RegisterType<Component>();builder.Register(c => new Component());

这似乎是反映查找最大构造函数、扫描属性、确定 autofac 是否可以解决该问题、如果不能继续下一个最小构造函数等的过程。因此直接指定构造函数给我们带来了巨大的改进。

我的问题是是否可以或应该对找到的构造函数进行某种缓存?由于容器是不可变的,因此您不能添加或减去注册,因此以后需要不同的构造函数。

我只是想在开始将大量注册切换到 lambda 之前检查一下,我们有 1550 个,将尝试找到核心的。

Autofac 确实缓存了很多它可以缓存的内容,但即使容器不可变,也有...

  • 注册来源:注册的动态供应商(例如,这就是处理开放仿制药的方式)
  • 子生命周期范围:对于活动的 WebAPI 请求,根容器可能没有当前 HttpRequestMessage,但您可以在子范围中添加和覆盖注册,因此请求生命周期 确实有它.
  • 解析时的参数:您可以将参数传递给解析操作,该操作将被纳入该操作。

给定这样的东西,缓存比“找到正确的构造函数一次,缓存它,再也不会看”要复杂一点。

如您所见,Lambda 会有所帮助,因此请研究一下。

我还会查看组件的生命周期范围。如果构造函数查找发生很多,这意味着您正在构造很多,这意味着您正在 分配 很多,这将花费您其他时间。更多的组件可以是单例还是per-lifetime-scope?使用现有实例会更便宜。

您还提到您注册了 1550 件东西。所有这些实际上都得到了使用和解决吗?不要注册不需要的东西。我见过很多次人们进行程序集扫描并尝试在整个应用程序的每个程序集中注册每种类型。我并不是说你正在这样做,但如果你是,就不要这样做。只需注册您需要的东西。

最后,想想你有多少构造函数。如果只有一个(推荐),它会比尝试许多不同的更快。您还可以在注册时使用 UsingConstructor 指定构造函数以强制选择并绕过搜索。