这使我困惑。我了解DNX和.NET Core CLI只是运行.NET Core应用程序的工具。如果这只是工具为什么从一个到另一个的迁移需要更改代码?
DNVM/DNU/DNX不只是工具。 DNX也是运行时间。它负责引导CLR并调用你的应用程序。这也意味着它有很多关于运行时和应用程序的信息,例如依赖关系,环境等。通过可以注入的各种服务将这些信息提供给应用程序,如IRuntimeEnvironment
,IApplicationEnvironment
和ILibraryManager
。
反过来,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
。
我希望这有一些意义。它可以真正令人困惑:)
感谢您的答案。我了解重命名的事情,也明白启动应用程序的需要。但是,在今天的公告中,我们甚至会看到“特定的DNX代码”,如'services.AddMvcDnx()'方法和DNX包装本身。为什么有DNX特定的代码? – user1620696
“这是RC1到RC2”这显然是错误的。这绝对是从DNX到dotnet的转变,需要更改代码。当然,从RC1到RC2需要做很多改变,但问题主要是关于DNX vs. dotnet和“AddMvcDnx”方法。 – khellang