项目
版本

为什么不是所有包都使用最新的 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 世界中的“商业成本”可能更好。 它确实会在应用程序配置文件中增加一些“混乱”,但在我们能够从方程中移除强命名之前,这是不可避免的需求。

在本文档中