为什么从 DNX 迁移到 .NET CLI 需要更改代码?

Why migrating from DNX to .NET CLI requires changes in the code?

今天,ASP.NET 核心的 RC1 版本与 DNX 配合使用。据我了解,RC2 的主要变化是 ASP.NET Core 将开始使用 .NET Core CLI。

现在这让人们对以下问题感到疑惑:如果 DNX 和 .NET CLI 只是工具,为什么此迁移需要更改代码?

确实今天有一个公告 Microsoft.AspNetCore.Mvc.Dnx is required to allow Mvc in RC2 to work with Dnx 我们看到要使用 ASP.NET 核心 MVC 和 DNX 我们需要添加一个包和更多包,我们需要更改我们的代码以便我们在 StartupConfigureServices 方法上调用 services.AddMvcDnx();

这让我很困惑。我了解到 DNX 和 .NET Core CLI 只是 运行 .NET Core 应用程序的工具。如果这只是工具,为什么从一个工具迁移到另一个工具需要更改代码?

这不是 DNX 到 dotnet cli 的切换,需要更改代码。它是 RC1 到 RC2。正如您在 rc2 milestone announcements 中看到的那样,34 个公告中有 31 个是关于重大更改的。

所有包和关联的命名空间都已更改,从 Microsoft.AspNet.* 更改为 Microsoft.AspNetCore.*,与 entity framework 相同。

如果您在 dnx 上有一个 RC2,然后切换到 dotnet cli,除了应用程序的启动方式之外,不会有很多(如果有的话)代码更改。

dotnet cli 中不再有命令,而且它们很可能不会返回。对于 dotnet cli,您需要像这样显式启动您的应用程序:

    public static void Main(string[] args)
    {
        var host = new WebHostBuilder()
                    .UseServer("Microsoft.AspNetCore.Server.Kestrel")
                    .UseStartup<Startup>()
                    .Build();

        host.Start();
    }

它还没有发布,所以中断代码更改仍然是可以预期的。

在 GitHub(来源和问题)上挖掘一点,我在这里得到了这个:

RC1 和早期版本的 RC2 用于将 IMvcRazorHost 注入到 ICompilationService 实现中,现在不再可用。正如您在 new package's commit.

中看到的那样,现在使用 RazorLoadContext

此外,我们还可以看到它的目标是 DOTNET5_6,这是一个新的名字,表示新的 platform standard 级别(dotnet 5.1 等于 netstandard 1.0,dotnet54 等于 1.3,因此 dotnet56 等于 netstandard 1.5) .

这个问题 here 指向 dotnet56/DOTNET5_6 的过渡。

This confuses me. I understood that DNX and .NET Core CLI were just tooling for running .NET Core apps. If this is just tooling why the migration from one to the other is requiring code changes?

DNVM/DNU/DNX 不仅仅是工具。 DNX 也是 运行 时代。它负责引导 CLR 和调用您的应用程序。这也意味着它有很多关于 运行 时间和应用程序的信息,例如依赖项、环境等。这些信息通过您可以注入的各种服务提供给应用程序,例如 IRuntimeEnvironment , IApplicationEnvironmentILibraryManager.

反过来,MVC 有一个名为 IAssemblyProvider 的服务。它负责提供 MVC 应在其中搜索控制器等的程序集。这个的默认实现是基于 ILibraryManager,这是一个特定于 DNX 的服务。这意味着当您切换到基于 dotnet 的 运行time 时,它​​将不再工作,它被包关闭,而不是使用单独的工具,如 DNVM。

为了解决这个问题,MVC 团队首先依赖 DNX 服务和更新的 dotnet 替代方案 (Microsoft.Extensions.DependencyModel)。可以看到代码here。它基本上检查 DNX 特定的 ILibraryManager 是否可用,如果不可用,它会回退到替代的 dotnet-API.

这种方法的问题在于它会在大多数情况下将额外的、在大多数情况下是冗余的依赖项 (Microsoft.Extensions.PlatformAbstractions.Dnx) 引入 MVC,而此时大多数人将开始使用它与 dotnet 工具和 运行时间。记住; DNX 等仍处于测试阶段,RTM 将消失。

相反,他们选择了当前的解决方案;有一个单独的包,Microsoft.AspNetCore.Mvc.Dnx,其中包含用于 MVC 的基于 DNX 的 IAssemblyProvider。你可以看到 AddMvcDnx 方法做了什么 here.

这意味着跟随预发布的少数人将不得不对他们的代码进行一些更改,以便仍然 运行 在 DNX 上(尽管我会尽快转移到 dotnet) ,而新用户只需像往常一样拨打 AddMvc

我希望其中的一些内容是有道理的。这真的很令人困惑 :)