为什么不是所有包都使用最新的 Autofac 核心?
Autofac 有很多 集成包 和扩展。你会发现,并非所有这些包都直接引用最新版的 Autofac 核心。
除非有技术原因需要将其中一个包的最低版本要求提高,否则我们会保持版本不变。
我们这么做是因为一般来说,我们不想强迫任何人更新他们的 Autofac 核心版本,除非他们必须这样做。这对任何库集来说都是一个不错的做法——如果用户不必更新,就不应该强制他们更新。
最简单的解决方案是在你的应用程序/项目中添加对所需 Autofac 核心版本的直接引用。
在 .NET Core 中,“这就可以工作”。 项目系统会自动识别项目中(即直接引用)的最新 Autofac 版本,并重定向所有绑定到该版本。无需额外的麻烦,就像魔法一样。
但在 .NET 全框架项目中,这会导致需要使用类型绑定重定向。 这是官方支持的方式,用来告诉 .NET 运行时需要将对强命名 assembly 的某个版本的请求重定向到该 assembly 的后续版本。这种情况很常见,因此 NuGet 和 Visual Studio 在许多情况下都会自动将这些配置添加到你的配置文件中。
以下是一个类型绑定重定向的例子:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Autofac"
publicKeyToken="17863af14b0044da"
culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.5.0.0"
newVersion="3.5.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Autofac.Extras.CommonServiceLocator"
publicKeyToken="17863af14b0044da"
culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.1.0.0"
newVersion="3.1.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Autofac.Extras.Multitenant"
publicKeyToken="17863af14b0044da"
culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.1.0.0"
newVersion="3.1.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Autofac.Integration.Mvc"
publicKeyToken="17863af14b0044da"
culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.3.0.0"
newVersion="3.3.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
类型绑定重定向是 assembly 强命名的不幸副产品。如果 assembly 不是强命名的,你就不需要绑定重定向;但在某些环境中需要 assembly 强命名,所以 Autofac 继续为 assembly 强命名。
即使 Autofac 总是保持所有引用是最新的,你仍然无法摆脱类型绑定重定向。 例如,Web API 集成 这样的 Autofac 集成包依赖于其他强命名包,而这些包又有自己的依赖关系。比如,Microsoft Web API 包依赖于 Newtonsoft.Json,但它们并不总是保持与最新版本同步。相反,它们会指定一个兼容的最低版本。如果你更新了本地的 Newtonsoft.Json 版本……你就会得到一个绑定重定向。
与其试图对抗绑定重定向,不如接受它作为 .NET 世界中的“商业成本”可能更好。 它确实会在应用程序配置文件中增加一些“混乱”,但在我们能够从方程中移除强命名之前,这是不可避免的需求。