Подтвердить что ты не робот

Owin: как передать аргументы в мой собственный класс запуска?

Я пытаюсь создать веб-приложение для самостоятельного хостинга api с помощью OWIN. В моем собственном классе XyzStartup мне нужен внешний аргумент: contentFolderPath.

Однако я не нашел способа передать этот аргумент. Вот мой код ниже:

var contentFolderPath = this.TextBox.Text; // user input

var startOptions = new StartOptions();
using(WebApp.Start<XyzStartup>(startOptions)){

}

Мой запуск

public class XyzStartup
{
     XyzStartup(string contentFolderPath) {  ...  }
}

Я заметил, что есть класс StartOption, но не использовать его. Могу ли я использовать его в своем классе XyzStartup?

Спасибо заранее!


Наконец-то я нашел способ сделать это:

var startOptions = new StartOptions();
startOptions.Urls.Add('..some url ..');

WebApp.Start(startOptions, (appBuilder)=>{
    new XyzStartup(contentFolderPath).Configuration(appBuilder);
}
4b9b3361

Ответ 1

Если вы хотите передать параметр в класс StartUp, вы можете использовать Action<IAppBuilder> в WebApp.Start, как Cillié Malan, упомянутый в комментарии вместо запуска с параметром Type (WebApp.Start<T>)

Вот конкретный пример для самостоятельного хостинга:

object someThingYouWantToAccess;
var server = WebApp.Start("http://localhost:8080/", (appBuilder) =>
{
    // You can access someThingYouWantToAccess here

    // Configure Web API for self-host.
    HttpConfiguration config = new HttpConfiguration();
    config.MapHttpAttributeRoutes();
    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );
    appBuilder.UseWebApi(config);
});

Ответ 2

Насколько я могу судить, хотя это возможно было раньше, невозможно передать параметры в класс запуска.

Однако при самообслуживании я заметил, что класс запуска создается в том же потоке, который вызывает WebApp.Start. Имея это в виду, я использовал поле ThreadStatic для передачи информации классу запуска (в моем случае я хотел передать HttpConfiguration):

    public class Startup
    {
        private HttpConfiguration _configuration;

        [ThreadStatic]
        internal static HttpConfiguration _configurationHolder;

        public static HttpConfiguration CurrentConfiguration
        {
            get { return _configurationHolder; }
            set { _configurationHolder = value; }
        }

        public Startup()
        {
            //get the configuration which is held in a threadstatic variable
            _configuration = _configurationHolder;
        }

        public void Configuration(IAppBuilder appBuilder)
        {
            //do stuff
        }
    }

И затем в другом месте у меня есть другой метод, который запускает сам размещенный сайт:

    public void Start(StartOptions startupOptions, HttpConfiguration configuration)
    {
        Startup.CurrentConfiguration = configuration;
        _application = WebApp.Start<Startup>(startupOptions);
        Startup.CurrentConfiguration = null;
    }