Лучший способ отделить конфигурацию запуска от веб-проекта в ASP.NET 5 и MVC 6

Используя MVC5, было очень легко создать проект загрузчика со ссылками на все уровни, тем самым отделив слой пользовательского интерфейса от ссылок, скажем, на логику инфраструктуры. Проект будет содержать логику конфигурации запуска, например настройку контейнера IoC.

Способ сделать это состоял в том, чтобы определить класс запуска:

public class Startup
{
    public static void Start()
    {
        // startup configuration (IoC etc) goes here
    }
}

Затем добавьте строку в AssemblyInfo.cs:

[assembly: PreApplicationStartMethod(typeof(Startup), "Start")]

К сожалению, этот подход больше не работает с asp.net 5. Я бегло просмотрел документацию, но все, что я узнал, это то, что фреймворк ищет класс с именем Startup в веб-проекте.

Я также просмотрел Microsoft.AspNet.Hosting исходный код, который кажется, отвечает за поиск класса Startup. Я вижу некоторые ссылки на класс конфигурации, поэтому есть вероятность, что сборку можно загрузить с помощью какого-либо параметра конфигурации, но я не смог подтвердить это или определить, какой именно параметр.

Кроме того, если это правда, как можно определить класс Startup с помощью файла config.json, когда сам файл загружается в классе Startup? Существуют ли различные варианты настройки начальной сборки, например, с использованием переменной среды?


person elolos    schedule 10.08.2015    source источник


Ответы (2)


Вы можете изменить сборку, где WebHostBuilder будет искать тип запуска.

Добавьте файл конфигурации INI с именем Microsoft.AspNet.Hosting.ini в папку wwwroot со следующим содержимым:

[Hosting]
Application = App.Bootstrapper

Где App.Bootstrapper — это пространство имен вашего проекта начальной загрузки приложения.

Однако класс запуска должен выглядеть одинаково, например. с ConfigureServices и Configure:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        // ...
    }

    public void Configure(IApplicationBuilder app)
    {
        // ...
    }
}

Если интересно, можете посмотреть логику определения типа запуска здесь. Если мы укажем ключ Hosting:Application в файле INI, он будет использовать это значение вместо appEnvironment.ApplicationName.

person Henk Mollema    schedule 10.08.2015
comment
Спасибо, я заметил строку, получающую значение из конфигурации, но я не ожидал, что это будет файл .ini. - person elolos; 10.08.2015
comment
@elolos конфигурация файла INI передается из Program класс уровня размещения. - person Henk Mollema; 10.08.2015
comment
Спасибо, Хенк, это сработало просто отлично, но с немного другим синтаксисом: Hosting:Application = App.Bootstrapper. Также обратите внимание, что для работы IIS вам необходимо скопировать dll библиотеки Bootstrapper в папку времени выполнения вашего веб-приложения. - person elolos; 12.08.2015
comment
@elolos это работало с синтаксисом, который я предоставил? Так и должно быть, поскольку Hosting — это раздел. - person Henk Mollema; 12.08.2015
comment
Извините, @Henk, оба синтаксиса работают нормально, вероятно, это была опечатка. У вас случайно нет ссылки на страницу документации об этих настройках? - person elolos; 12.08.2015
comment
Для справки в будущем, согласно github.com/aspnet/Hosting/issues/269, файл Microsoft.AspNet.Hosting.ini может измениться на Microsoft.AspNet.Hosting.json в будущем обновлении фреймворка. - person elolos; 13.08.2015

Просто хотел сосредоточиться на этом, в asp.net core rtm вам не нужны ни .ini, ни .json, все, что вам нужно сделать, это вызвать .UseStartup("NamespaceOfYourStartup") и убедиться, что сборка, содержащая класс Startup, находится в в том же месте, где ваш основной веб-проект asp.net опубликовал файлы.

person Binoy    schedule 25.08.2016