WebApp.Start <TStartup>方法类型参数

Phi*_*ler 13 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方法(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);
    }
} 
Run Code Online (Sandbox Code Playgroud)

它工作正常,所以没有抱怨.

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

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

bik*_*868 6

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

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

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

  • 在这种情况下,他们应该引入一个新接口和一个带有新约束的新 Start 方法(命名不同,因为方法不能仅在约束上有所不同)。无论如何,我不确定为什么他们甚至有泛型类型参数重载。你可以只调用`WebApp.Start(BaseAddress, new Startup().Configuration);`,或者更好的是`WebApp.Start(BaseAddress, Startup.Configuration);`,如果你将`Configuration` 方法设为`static`。 (2认同)