web-dev-qa-db-fra.com

Comment passer des arguments à ma propre classe de démarrage?

J'essaie de développer une application d'hébergement Web autonome en utilisant OWIN. Dans ma propre classe XyzStartup, j'ai besoin d'un argument externe: contentFolderPath.

Cependant, je n'ai pas trouvé de moyen de passer cet argument. Voici mon code ci-dessous:

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

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

}

Ma startup

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

J'ai remarqué qu'il existe une classe StartOption, mais ne savez pas comment l'utiliser. Puis-je l'utiliser dans ma classe XyzStartup?

Merci d'avance!


Je trouve enfin un moyen de le faire:

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

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

Si vous souhaitez passer le paramètre à la classe StartUp, vous pouvez utiliser Action<IAppBuilder> dans WebApp. Commencez comme Cillié Malan mentionné dans le commentaire au lieu de lancer avec le paramètre Type (WebApp.Start<T>)

Voici un exemple concret d'auto-hébergement:

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);
});
25
Steven

Pour autant que je sache, bien que cela ait pu être possible auparavant, il n'est pas possible de passer des paramètres à la classe de démarrage.

Cependant, lors de l'auto-hébergement, j'ai remarqué que la classe de démarrage est créée dans le même thread qui appelle WebApp.Start. Dans cet esprit, j'ai utilisé un champ ThreadStatic pour transmettre des informations à la classe de démarrage (dans mon cas, je voulais passer 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
        }
    }

Et puis ailleurs, j'ai une autre méthode qui démarre le site auto-hébergé:

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