C# WebApp.Start<;t启动>;方法类型参数

C# WebApp.Start<;t启动>;方法类型参数,c#,windows-services,owin,asp.net-web-api2,C#,Windows Services,Owin,Asp.net Web Api2,在基于本文使用Owin将我的Windows Service应用程序设置为自主机时: 我使用了WebApp的此重载。开始方法: 这是我的密码: //(in startup method) _server = WebApp.Start<Startup>(BaseAddress); public class Startup { // This code configures Web API. The Startup class is specified as a type

在基于本文使用Owin将我的Windows Service应用程序设置为自主机时:

我使用了WebApp的此重载。开始方法:

这是我的密码:

//(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);
    }
} 
//(在启动方法中)
_服务器=WebApp.Start(基本地址);
公营创业
{
//此代码配置Web API。启动类被指定为类型
//WebApp.Start方法中的参数。
公共无效配置(IAppBuilder appBuilder)
{
//为自主机配置Web API。
var config=新的HttpConfiguration();
config.Routes.maphttroute(“DefaultApi”、“api/{controller}/{id}”),新增
{
id=路由参数。可选
});
appBuilder.UseWebApi(配置);
}
} 
它工作正常,所以没有抱怨

但启动方法的类型参数的具体要求是什么?它似乎没有任何约束,而且我还没有找到关于我在这个参数上的选项/要求的任何文档。它是否寻找将IAppBuilder作为参数的方法?如果我将Configuration()方法的名称更改为其他名称,该怎么办?如果我将该方法设置为内部的呢?我可以用这个类配置其他选项吗


所有这些都记录在哪里?我觉得如果没有上面链接的文章,我将永远无法弄清楚该实现什么。

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

我同意这并不像我们希望的那样容易发现,我不知道为什么最初的开发人员以这种方式实现它,而不是添加一个
,其中T:IStartup
约束。这不仅使它在没有文档的情况下更容易被发现,而且还允许编译器在编译时检查它


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

我的感觉是一样的:最坏的情况下,您可以随时阅读源代码:因为我的是唯一的答案,你能把它标记为正确答案吗?即使我实现了
IStartup
,我也可以添加更多的方法,我不是说我会,但我可以。有了这个接口,代码对我来说就更直观了。我的观点是,如果OWIN团队定义了这个接口,那么以后OWIN团队会向这个接口定义中添加新方法,那么您的代码将不再编译(直到您添加了额外方法的实现)。更糟糕的是,如果您将代码编译成一个程序集,并与其他人共享,而他们在
IStartup
界面中使用其他方法更新到较新版本的OWIN,那么您的代码将在运行时中断。reply是有意义的,但我可以认为向后兼容性是它带来的唯一好处。如果在新版本中,
OWIN
spec引入了一个新的must-implementation方法,我们甚至不知道该方法,并且可能会导致运行时问题,对我来说编译时问题比运行时异常更干净。在这种情况下,他们应该引入一个新接口和一个具有新约束的新Start方法(名称不同,因为方法不能仅在约束方面有所不同)。无论如何,我不确定它们为什么会有泛型类型参数重载。您可以调用
WebApp.Start(BaseAddress,new Startup().Configuration);
,或者更好的是
WebApp.Start(BaseAddress,Startup.Configuration)
如果你使用
配置
方法
静态
。我同意你的观点,我的朋友。我并不同意微软的做法,只是解释了它的工作原理并推测了他们选择的原因。微软的大多数软件设计得如此糟糕,这总是让我感到惊讶。t最奇怪的是,他们有很多非常聪明的开发者,所以这一定是公司政策和文化的问题。