asp.net 5中的Startup类让我感到奇怪。它不是类Startup:ISomething或Startup:BaseSomething,其中接口或基类是某些Microsoft.AspNet。*程序集的一部分。 No Startup只是一个普通的类,具有按惯例创建的正确的魔法方法签名。
如何从DNX传递到Startup.ConfigureServices?
让我们举个例如:
dnx.exe . web
所以。告诉dnx它可以在当前文件夹中找到project.json。从那里找到与键“web”相关联的命令。所以如果本地project.json有这个:
"commands": {
"web" : Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.WebListener --server.urls http://localhost:5000"
}
我将采取一个结合它将相当于: dnx.exe。 Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.WebListener --server.urls http://localhost:5000“
我还了解了dnx如何使用project.json中的参数收集内存编译中的所有源(包括依赖项),因此我们现在拥有用户的程序集“MyAssembly”以及dnx可用的所有依赖程序集。 dnx已将Microsoft.AspNet.Hosting加载为托管入口点。因此,执行从非托管“存根”传递到Microsoft.AspNet.Hosting托管程序集。到目前为止正确吗?
接下来的参数是指示Microsoft.AspNet.Hosting它将托管Microsoft.AspNet.Server.WebListener的实例(特别是在localhost的端口500上)。好的,Microsoft.AspNet.Server.WebListener如何“知道”在“MyAssembly”中查找一个名为“Startup”的类。它只是硬编码到Microsoft.AspNet.Server.WebListener?进入Microsoft.AspNet.Hosting?
跳转到Startup类似乎是最后一个“魔术”。之前和之后的执行开始变得非常清楚但我觉得我仍然缺少一些东西。
答案 0 :(得分:4)
DNX知道如何加载和执行具有名为Program
的类的程序集,该程序集具有名为Main
的方法。运行Microsoft.AspNet.Hosting
命令时,您将web
作为启动程序集传递给DNX。
托管有Main method。
最终从上面提到的Main方法调用的答案 1 :(得分:1)
我想在Victor的回答中添加一些细节:
我写了一系列帖子,深入研究了从the DNX native host到request handling引导ASP.NET 5应用程序的细节。所有这些执行细节都包含在帖子中。