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

use*_*696 5 c# asp.net asp.net-mvc .net-core asp.net-core

今天,ASP.NET Core的RC1版本与DNX一起使用.据我所知,RC2的主要变化是ASP.NET Core将开始使用.NET Core CLI.

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

确实今天有人宣布需要Microsoft.AspNetCore.Mvc.Dnx来允许RC2中的Mvc与Dnx一起使用,我们看到使用带有DNX的ASP.NET Core MVC我们需要添加一个包以及更多,我们需要更改我们的代码,以便我们对调用ConfigureServices方法有所Startup了解services.AddMvcDnx();

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

khe*_*ang 8

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

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

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

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

这种方法的问题在于Microsoft.Extensions.PlatformAbstractions.Dnx,当大多数人开始将它与dotnet工具和运行时一起使用时,它会在MVC中引入额外的,在大多数情况下,冗余的依赖项().记得; DNX等仍然是beta版本,将由RTM消失.

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

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

我希望其中一些是有道理的.这可真是令人困惑:)


Tse*_*eng 5

这不是DNX到dotnet cli开关,需要更改代码.这是RC1到RC2.正如您在rc2里程碑公告中所看到的,34个公告中有31个是关于重大变更的.

所有包和相关的命名空间得到了改变,从Microsoft.AspNet.*Microsoft.AspNetCore.*,同为实体框架.

如果您在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();
    }
Run Code Online (Sandbox Code Playgroud)

它仍未发布,因此仍然需要破坏代码更改.

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

在RC1和早期建立RC2的用于注入IMvcRazorHostICompilationService实现,它不再可用.现在RazorLoadContext使用它,就像你在新包的提交中看到的一样.

更进一步,我们可以看到它的目标是DOTNET5_6这是一个新的名字,表明一个新的平台标准级别(dotnet 5.1等于netstandard 1.0,dotnet54等于1.3,所以dotnet56等于netstandard 1.5).

这个问题在这里所指的过渡到dotnet56/ DOTNET5_6.