Сегодня выпуск ASP.NET Core RC1 работает с DNX. Как я понял, главным изменением для RC2 будет то, что ASP.NET Core начнет работать с .NET Core CLI.

Это заставило задуматься о следующем: если DNX и .NET CLI просто инструменты, почему эта миграция требует изменений в коде?

Действительно, сегодня было объявлено, что требуется Microsoft.AspNetCore.Mvc.Dnx, чтобы Mvc в RC2 мог работать с Dnx на котором мы видим, что для использования ASP.NET Core MVC с DNX нам нужно добавить один или несколько пакетов, нам нужно изменить наш код так, чтобы у нас был в методе ConfigureServices вызова Startup для services.AddMvcDnx();

Это меня смущает. Я понял, что DNX и .NET Core CLI были просто инструментами для запуска приложений .NET Core. Если это всего лишь инструмент, почему для перехода с одного на другой требуется изменение кода?

5
user1620696 29 Фев 2016 в 03:02

2 ответа

Лучший ответ

Это меня смущает. Я понял, что DNX и .NET Core CLI были просто инструментами для запуска приложений .NET Core. Если это всего лишь инструмент, почему для перехода с одного на другой требуется изменение кода?

DNVM / DNU / DNX - это не просто инструменты. DNX также был средой выполнения. Он отвечал за загрузку среды CLR и вызов вашего приложения. Это также означало, что у него было много информации о среде выполнения и приложении, например о зависимостях, среде и т. Д. Эта информация была сделана доступной для приложения через различные службы, которые вы могли внедрить, например IRuntimeEnvironment, {{X1} } и ILibraryManager.

В свою очередь, в MVC есть служба под названием IAssemblyProvider. Он отвечает за предоставление сборок, в которых MVC, помимо прочего, должен искать контроллеры. Реализация этого по умолчанию была основана на ILibraryManager, который является службой, специфичной для DNX. Это означает, что он больше не будет работать, когда вы переключитесь на среду выполнения на основе dotnet, которая отключается пакетами, вместо использования отдельного инструмента, такого как DNVM.

Чтобы исправить это, команда MVC сначала начала полагаться как на службы DNX, так и на более новую альтернативу dotnet (Microsoft.Extensions.DependencyModel). Вы можете увидеть код здесь.

Это означает, что нескольким людям, которые следят за предварительными выпусками, придется внести некоторые изменения в свой код, чтобы по-прежнему работать на DNX (хотя я бы перешел на dotnet как можно скорее), в то время как новым людям нужно будет только позвонить AddMvc как обычно.

Я надеюсь, что кое-что из этого имело смысл. Это может сбивать с толку :)

8
khellang 1 Мар 2016 в 11:24

Изменения кода требует не переключение DNX на dotnet cli. Это от RC1 до RC2. Как вы можете видеть в объявлениях о вехах rc2, 31 из 34 объявления о критических изменениях.

Все пакеты и связанные пространства имен были изменены с Microsoft.AspNet.* на Microsoft.AspNetCore.*, то же самое для структуры сущностей.

Если бы у вас был RC2 на dnx, а затем вы переключились на 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, как вы можете видеть в фиксация нового пакета.

Более того, мы видим, что он нацелен на DOTNET5_6, который является новым прозвищем, указывающим на новый стандарт платформы уровня (dotnet 5.1 равен netstandard 1.0, dotnet54 равен 1.3, поэтому dotnet56 будет равен netstandard 1.5).

Эта проблема, здесь, указывает на переход к dotnet56 / DOTNET5_6 .

5
Tseng 29 Фев 2016 в 08:32