WebApp.Start <tstartup>方法类型参数</tstartup>

时间:2014-07-24 13:27:43

标签: c# windows-services owin asp.net-web-api2

根据本文使用Owin将我的Windows服务应用程序设置为自托管:

http://www.asp.net/web-api/overview/hosting-aspnet-web-api/use-owin-to-self-host-web-api

我使用了WebApp.Start方法的重载:

WebApp.Start Method (String)

这是我的代码:

//(in startup method) 
_server = WebApp.Start<Startup>(BaseAddress);

public class Startup
{
    // This code configures Web API. The Startup class is specified as a type
    // parameter in the WebApp.Start method.
    public void Configuration(IAppBuilder appBuilder)
    {
        // Configure Web API for self-host. 
        var config = new HttpConfiguration();
        config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}", new
        {
            id = RouteParameter.Optional
        });

        appBuilder.UseWebApi(config);
    }
} 

工作正常,所以没有抱怨。

但是Start方法的type参数的要求究竟是什么?它似乎没有任何限制,我也无法找到有关此参数的选项/要求的任何文档。它是否寻找将IAppBuilder作为参数的方法?如果我将Configuration()方法的名称更改为其他内容怎么办?如果我将方法设为内部怎么办?我可以使用此类配置其他选项吗?

所有这些记录在哪里?我觉得没有上面链接的文章,我从来没有能够弄清楚要实施什么。

1 个答案:

答案 0 :(得分:6)

WebApp类使用反射来获取指向Configuration(IAppBuilder)方法的指针,然后调用它。如果作为泛型类型参数提供的类没有带有预期参数的Configuration方法,那么在运行时会出现错误。

我同意这不像我们想象的那样可以发现,我不确定为什么原始开发人员以这种方式实现它而不是添加where T: IStartup约束。如果没有文档,这不仅会使它更容易被发现,而且还允许编译器在编译时检查它。

这种方法的唯一优势是OWIN开发人员可以在不破坏现有代码的情况下,在将来添加更多具有不同签名的方法或方法。