Почему переход с DNX на .NET CLI требует изменений в коде?

Сегодня выпуск RC1 ASP.NET Core работает с 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. Если это всего лишь инструменты, то почему переход с одного на другой требует изменения кода?


person user1620696    schedule 29.02.2016    source источник


Ответы (2)


Это меня смущает. Я понял, что 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). Вы можете увидеть код здесь. По сути, он проверяет, доступен ли ILibraryManager, специфичный для DNX, и, если нет, возвращается к альтернативному API-интерфейсу dotnet.

Проблема с этим подходом заключается в том, что он вводит дополнительные и в большинстве случаев избыточные зависимости (Microsoft.Extensions.PlatformAbstractions.Dnx) в MVC, в то время как большинство людей начнут использовать его с инструментами dotnet и средой выполнения. Помните; DNX и т. д. все еще находятся в стадии бета-тестирования и исчезнут в RTM.

Вместо этого они выбрали текущее решение; есть отдельный пакет Microsoft.AspNetCore.Mvc.Dnx, который содержит, среди прочего, IAssemblyProvider на основе DNX для MVC. Вы можете увидеть, что делает метод AddMvcDnx здесь< /а>.

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

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

person khellang    schedule 01.03.2016

Это не переход от 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.

person Tseng    schedule 29.02.2016
comment
Спасибо за ответ. Я понимаю переименование, а также необходимость явного запуска приложения. Но опять же, в сегодняшнем анонсе мы видим даже специфический код DNX вроде метода services.AddMvcDnx() и самих пакетов DNX. Почему существует специальный код DNX? - person user1620696; 29.02.2016
comment
Это от RC1 до RC2. Это просто неправильно. Именно переход от DNX к dotnet требует изменения кода. Конечно, для перехода от RC1 к RC2 требуется много изменений, но вопрос был конкретно о DNX и dotnet и методе AddMvcDnx. - person khellang; 19.03.2016