2016-02-29 72 views
5

今天,ASP.NET Core的RC1版本与DNX协同工作。据我了解,RC2的主要变化是ASP.NET Core将开始与.NET Core CLI合作。为什么从DNX迁移到.NET 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应用程序的工具。如果这只是工具为什么从一个到另一个的迁移需要更改代码?

回答

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)。你可以看到代码here。它主要检查DNX特定的ILibraryManager是否可用,如果不可用,则回退到替代的dotnet-API。

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

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

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

我希望这有一些意义。它可以真正令人困惑:)

5

这不是dotnet cli交换机的DNX,它需要更改代码。这是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的用于注入IMvcRazorHostICompilationService实现,它不再可用。现在,您可以使用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

+0

感谢您的答案。我了解重命名的事情,也明白启动应用程序的需要。但是,在今天的公告中,我们甚至会看到“特定的DNX代码”,如'services.AddMvcDnx()'方法和DNX包装本身。为什么有DNX特定的代码? – user1620696

+1

“这是RC1到RC2”这显然是错误的。这绝对是从DNX到dotnet的转变,需要更改代码。当然,从RC1到RC2需要做很多改变,但问题主要是关于DNX vs. dotnet和“AddMvcDnx”方法。 – khellang