參考來源:html
http://docs.asp.net/en/latest/conceptual-overview/aspnet.htmlnode
http://docs.asp.net/en/latest/fundamentals/startup.htmlweb
asp.net5應用是運行在dnx之上的,每個程序都是一個dnx項目,經過 Microsoft.AspNet.Hosting 這個包來加載的。編程
與Node.js作個類比:json
node.exe index.js 至關於node這個程序打開代碼文件,加載運行。c#
在進程裏增長一個Node.js: Server-side JavaScript的進程,佔空間7.6MB。windows
dnx web 至關於dnx程序搜索當前目錄,找到project.json,並找到裏面相應的命令,而後加載相應的代碼並運行。緩存
我機器是64位的win10.,在進程裏增長一個dnx(32位)的進程,在我機器上大概28MB的內存。 mvc
public class Startup{ public void ConfigureServices(IServiceCollection services) { //定義用戶服務 } public void Configure(IApplicationBuilder app) { //定義中間件 }}
底層是經過DI 而建立的組件,用於通用部分。服務有三種:單件、局部做用域、即時服務。app
即時服務,每次使用都建立。局部做用域服務是每次請求時,建立一個做業域。單件服務是全局只有一個的服務。
中間件是asp.net5處理時每一個請求管道。它處理HttpContext 上的異步邏輯,而且能夠按順序調用以後的中間件,也能夠隨時中斷請求。是在Configure方法裏,一般用UseXXX的一個IApplicationBuilder 擴展方法來調用。
asp.net5有一組預約義好的中間件,好比靜態文件訪問,路由,診斷,認證。 你還能夠自定義一個
經過Hosting並不直接監聽請求,而是一個HTTP Servergo 監聽,並將其轉爲一個HttpContext。
服務支持IIS或者self hosting 。在window上, WebListener server是基於HTTP.sys,而且脫離IIS的一個服務。
在非windows中,可使用跨平臺的 Kestrel web server
Web root
在project.json中,能夠定義根目錄。好比處理靜態文件時的根目錄。
asp.net5支持一種簡單的 鍵值對的配置信息。 它是內置的功能,支持多種文件類型、環境變量。
在startup.cs中,定義一個靜態變量。初始化時,讓它加載各類配置。而後程序其它地方直接經過
Startup.Configure就能使用信息。
應用啓動
Startup類是程序的入口,這裏加載配置,服務。啓動時,會在程序集中在全部空間搜索叫Startup的類。你也能夠指定一個類名,經過Hosting:Application 的配置的鍵值,啓動類是否是public並沒有關係。 若是有多個同名的類,程序會搜索與項目根命名空間相同的優先,找不到,則根據命名空間的字母表順序來決定。
Startup類的構造函數也支持依賴注入,好比IApplicationEnvironment的參數。
Startup類一般它必須定義一個Configure函數,以及可選的ConfigureServices函數。
Configure函數是用來指定應用如何處理HTTP請求的。一般複雜的請求管道的配置是封閉在中間件裏,而後中間件再作成IApplicationBuilder的擴展方法來被Use. 函數必須有IApplicationBuilder 類型 的參數,後兩個是可選的參數IHostingEnvironment
and ILoggerFactory
這些參數的對象都是經過依賴注入產生的。依賴注入是Microsoft.Extensions.DependencyInjection包實現的功能。它向外提供IServiceCollection的一個實例,掛載着全部已經添加的ServiceDescriptors。
我的認爲asp.net5此處的Service命名有些問題 !IServiceCollection本是依賴注入的服務集合,它能夠隨時添加一個服務描述符(ServiceDescriptors),也隨時能夠反向生成一個實例對象來。asp.net5自身的服務Service前面描述過,表明一個功能模塊或功能組件,好比mvc,靜態文件服務等。
但我也不肯定這兩個Service到底指定的是否是同一個意思,或是故意爲之。
public void ConfigureServices(IServiceCollection services){ Console.WriteLine(services.Count); //顯示13 services.AddMvc(); Console.WriteLine(services.Count);//顯示112,代表向依賴注入的服務集合裏緩存了99個服務描述 }
asp.net5的依賴注入的相關內容看了一些,但一直沒法深刻。由於每一個文檔都是在講:如何在Startup裏自動注入參數,如何在Startup裏添加一個服務,而後到Controller裏,構造注入。
關鍵的疑問點:Startup構造函數,Configure函數,Controller的構造函數注入時,爲何寫個參數就能注入了,這不很奇怪嗎?是經過重載實現的嗎?可能須要看一下源碼才能夠。
ConfigureServices
函數
這個函數在Startup類裏,是可選的。它能夠經過注入,傳入一個IServiceCollection
實例做爲參數.
ConfigureServices函數比Configure更早的調用,services.AddMvc();能夠引入許多MVC必須的一些服務。
這樣在app.UseMvc()時,這些服務才能在請求來到 時被使用。
建議在使用時,把一些服務作成IServiceCollection 的擴展,好比下面這樣:
services.AddEntityFramework() .AddSqlServer();
這些添加進來的服務就進入到依賴注入的容器裏了,隨時能夠在你的應用中訪問到。經過依賴注入,能夠在函數裏注入參數,代替「硬編碼」,是很是好的編程實踐!
ConfigureServices函數仍是你添加配置---Configuration的地方
最後一段是講框架支持注入的服務,重點是Startup構造函數以及兩個Configre的函數裏的參數。它們分別有什麼用,有什麼屬性能夠獲取!
The framework services and objects include:
IApplicationBuilder
Used to build the application request pipeline. Available only to the Configure
method in Startup
. Learn more about Request Features.
IApplicationEnvironment
Provides access to the application properties, such as ApplicationName
,ApplicationVersion
, and ApplicationBasePath
. Available to the Startup
constructor andConfigure
method.
IHostingEnvironment
Provides the current EnvironmentName
, WebRootPath
, and web root file provider. Available to the Startup
constructor and Configure
method. Learn more about 🔧 Hosting.
ILoggerFactory
Provides a mechanism for creating loggers. Available to the Startup
constructor andConfigure
method. Learn more about Logging.
IServiceCollection
The current set of services configured in the container. Available only to theConfigureServices
method, and used by that method to configure the services available to an application.
下面是三個函數調用裏,服務所對應的參數依次是
Startup Constructor - IApplicationEnvironment
- IHostingEnvironment
- ILoggerFactory
ConfigureServices - IServiceCollection
Configure - IApplicationBuilder
- IApplicationEnvironment
- IHostingEnvironment
-ILoggerFactory