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);
}
Ответы
Ответ 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;
}