Asp.net web api 将配置属性传递给控制器

Asp.net web api 将配置属性传递给控制器,asp.net-web-api,owin,Asp.net Web Api,Owin,我在一个Windows服务中自托管Owin,该服务提供一些功能,并可以访问其他窗口以实现其他功能。我有一个供应商正在启动Owin应用程序,也是系统所有功能的入口点 如何将对提供程序的引用传递给每个控制器?ApiController类提供Configuration.Properies,但我找不到将提供程序引用添加到配置属性的方法。StartOptions类具有设置,但只接受字符串值。我也看不到向Startup类的配置方法传递额外参数的方法 public class Provider : BaseP

我在一个Windows服务中自托管Owin,该服务提供一些功能,并可以访问其他窗口以实现其他功能。我有一个供应商正在启动Owin应用程序,也是系统所有功能的入口点

如何将对提供程序的引用传递给每个控制器?ApiController类提供Configuration.Properies,但我找不到将提供程序引用添加到配置属性的方法。StartOptions类具有设置,但只接受字符串值。我也看不到向Startup类的配置方法传递额外参数的方法

public class Provider : BaseProvider
{
   public override void StartUp()
   {
      var options = new StartOptions();
      //StartOptions.Settings only allows string values
      //I need to pass this provider to the controllers

      WebApp.Start<StartUp>("http://SVS:1234");
   }
}

internal class StartUp
{
    private Provider _provider = null;

    internal void Configuration(IAppBuilder app)
    {
        var config = new HttpConfiguration();

        config.Routes.MapHttpRoute(
            name: "POSEngineAPI",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
            );

        //??? How can I set _provider when calling Startup.Config?
        config.Properties.AddOrUpdate("Provider", _provider, (key, value) => _provider);

        app.UseWebApi(config);
    }
}

internal class SessionController : ApiController
{
    [HttpPost]
    public IHttpActionResult PostSession(Session session)
    {
        var provider = GetProvider();
        //TODO
        return Ok(session);
    }

    [HttpPut]
    public IHttpActionResult PutSession(Session session)
    {
        var provider = GetProvider();
        //TODO
        return Ok(session);
    }

    private WebApiSignalRProvider GetProvider()
    {
        return Configuration.Properties["Provider"] as Provider;
    }
}
公共类提供程序:BaseProvider
{
公共覆盖无效启动()
{
var options=newstartoptions();
//StartOptions。设置仅允许字符串值
//我需要将此提供程序传递给控制器
WebApp.Start(“http://SVS:1234");
}
}
内部类启动
{
私有提供者_Provider=null;
内部无效配置(IAppBuilder应用程序)
{
var config=新的HttpConfiguration();
config.Routes.MapHttpRoute(
名称:“POSEngineAPI”,
routeTemplate:“api/{controller}/{id}”,
默认值:新建{id=RouteParameter.Optional}
);
//?调用Startup.Config时如何设置\u提供程序?
config.Properties.AddOrUpdate(“Provider”,_Provider,(key,value)=>_Provider);
app.UseWebApi(配置);
}
}
内部类SessionController:ApicController
{
[HttpPost]
公共IHttpActionResult后期会话(会话)
{
var provider=GetProvider();
//待办事项
返回Ok(会话);
}
[HttpPut]
公共IHttpActionResult PutSession(会话会话)
{
var provider=GetProvider();
//待办事项
返回Ok(会话);
}
私有WebApiSignalProvider GetProvider()
{
将Configuration.Properties[“Provider”]返回为Provider;
}
}

我不熟悉Web Api和Owin,因此可能遗漏了一些明显的内容。

为什么需要在由该运行程序启动的Web应用程序的控制器中引用Web app runner类?该提供程序本质上是一个适配器,用于将客户端通信转换为我们服务使用的WCF通信。PutSession实现类似于“返回Ok(provider.OpenSession(session))’。我现在明白app.UseWebApi不仅仅是初始化内存中的组件——它实际上是启动一个单独的应用程序域,所以你不能只是传入一个引用,这是有道理的。我必须后退几步,重新考虑我们设计的这一部分。