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

时间:2016-02-29 00:02:46

标签: c# asp.net asp.net-mvc asp.net-core .net-core

今天,ASP.NET Core的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 Core MVC和DNX我们需要添加一个包等等,我们需要更改我们的代码,以便我们在{ {1}} ConfigureServices拨打Startup

的方法

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

2 个答案:

答案 0 :(得分:8)

  

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

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

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

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

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

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

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

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

答案 1 :(得分:5)

它不是DNX到dotnet cli开关,需要更改代码。它是RC1到RC2。正如您在rc2 milestone announcements中所看到的,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();
    }

它还没有发布,所以仍然需要打破代码更改。

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

RC1和RC2的早期版本用于将IMvcRazorHost注入ICompilationService实现,这不再可用。现在使用的是RazorLoadContext,您可以在new package's commit中看到。

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

此问题here指向过渡到dotnet56 / DOTNET5_6