【问题标题】:Hw to pass arguments to my own Startup class?如何将参数传递给我自己的 Startup 类?
【发布时间】:2014-06-09 02:40:46
【问题描述】:

我正在尝试使用 OWIN 开发一个 Web api 自托管应用程序。 在我自己的 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);
}

【问题讨论】:

标签: c# owin


【解决方案1】:

据我所知,虽然以前可能可以,但无法将参数传递给启动类。

但是,在自托管时,我注意到启动类是在调用 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;
    }

【讨论】:

  • 另外,我刚刚注意到WebApp.Start 有一个接受Action&lt;IAppBuilder&gt; 的重载,在这种情况下,您可以捕获您可能需要的任何参数。
【解决方案2】:

如果您想将参数传递给 StartUp 类,您可以像评论中提到的 Cillié Malan 一样在 WebApp.Start 中使用 Action&lt;IAppBuilder&gt;,而不是使用 Type 参数启动 (WebApp.Start&lt;T&gt;)

这是一个自托管的具体示例:

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

【讨论】:

    猜你喜欢
    • 2017-02-24
    • 1970-01-01
    • 2023-01-28
    • 1970-01-01
    • 2018-09-20
    • 1970-01-01
    • 2015-08-14
    • 1970-01-01
    • 2013-07-27
    相关资源
    最近更新 更多