文章出處

對于上面創建的這個Hello World應用來說,程序入口點由應用自身來提供,所以應用本身具有自我執行的能力。從應用托管(Host)的角度來講,這樣的應用同時負責對自身的托管。將應用與托管環境獨立起來其實是更好的選擇,因為這樣可以使同一個應用運行于不同的環境中。接下來我們就來演示如何為應用指定入口程序來達到應用與應用托管的分離。現在我們在HelloWorld目錄下創建兩個子目錄,并分別將它們命名為Project2Project3。Project2代表應用本身,但是真正的入口程序則由Project3代表的項目提供,換句話說Project3是Project2 的宿主(Host)。兩個項目對應目錄及其源文件結構:

Project2
    Startup.cs
    project.json

Project3
    Program.cs
    project.json

 

我們在Project2目錄下添加一個文本文件并將其命名為Startup.cs,并按照如下的方式定義一個同名的類型。

using System;

namespace Project2
{
    public class Startup
    {
        public void Configure()
        {
            Console.WriteLine("Hello World!");
        }
    }
}

如上面的代碼片斷所示,我們在Startup類中定義了一個Configure方法,我們希望在應用的入口程序在正常啟動并完成初始化之后自動回調這個方法。對于應用自身來說,Startup是被啟動之后最先執行的類型,我們可以將一些針對應用的配置定義在Configure方法中。不過作為演示,我們僅僅讓此方法在控制臺上打印“Hello World”字樣。

我們說過任何一個被KRuntime視為項目的目錄必須包含一個project.json文件,所以我們需要在Project2目錄下創建這個一個文本文件,我們指定的入口程序就定義在這個文件之中。如下所示的是這個project.json文件的內容,我們僅僅在其commands配置項中添加了一個名為“RunFromProject3”的命令,對應的值為“Project3 Startup Configure”,其中Project3代表包含入口程序的程序集(項目Project3被編譯后生成的程序集)名稱,Startup和Configure組成的字符串數組將作為程序入口方法(Main)的參數,它們分別表示應用啟動程序所在的類型和對應的方法。我們同時在dependencies這個配置項中添加了針對Project3的項目依賴,這相當于在當前項目中添加了一個對應的項目引用。

{
   commands:{
      "RunFromProject3": "Project3 Startup Configure" 
   },
   dependencies:{
       "Project3":""
  }
}

接下來我們在Project3目錄下添加一個文本文件并將其命名為Program.cs,然后安裝如下的形式定義這個作為程序入口的Program類型。與上面演示的第一個Hello World應用一樣,作為程序入口的類型必須命名為Program,其中包含一個靜態或者實例Main方法。如上面的代碼片斷所示,Main方法的目的在于解析定義在Project2的Startup類型,然后據此類型實例化一個對應的對象并調用其Configure方法。類型和方法的名稱來源于Main方法的參數,而類型解析采用的程序集名稱與當前目錄(%CD%)名稱一致。

using System;
using System.IO;
using System.Reflection;
using System.Linq;

namespace Project3
{
    public class Program
    {
        public void Main(string[] args)
        {
            string startup 	         = args[0];
            string configure 	     = args[1];
            string appBase 	         = Directory.GetCurrentDirectory();
            string appName 	         = appBase.Substring(appBase.LastIndexOf('\\') + 1);

            Type startupType = Assembly.Load(new AssemblyName(appName))
                   .GetTypes().FirstOrDefault(type => type.Name == startup);
            startupType.GetMethod(configure)
                .Invoke(Activator.CreateInstance(startupType), new object[] { });
        }
    }
}

image

在完成對作為入口程序的Program類的定義之后,我們同樣需要在Project3目錄下創建一個必需的project.json文件。和第一個演示的Hello World應用一樣,這里不需要任何的配置,所以直接將內容設置為“{}”即可。

在Project2的project.json文件中,我們在其commands配置項中定義了一個命令,其實這個命令是為K.cmd定義,我們可以直接利用后者執行這個命令。與執行第一個Hello World程序一樣,我們開啟CMD命令行工具。在通過CD命令將Project2設置為當前目錄之后,我們按照如下的方式執行K RunFromProject3(RunFromProject3是在project.json中定義的命l令名稱)。從控制臺的輸出可以確定我們的應用被正常啟動了。

設置自定義的入口程序體現應用本身與應用托管之間的分離,它使我們可以創建獨立于托管環境的應用,并根據需要寄宿于任何一個我們希望的宿主程序下,對于Web應用來說這一點尤為重要。對于之前的Web應用來說,IIS是它們唯一的宿主,但是ASP.NET 5應用卻可以將我們指定的入口程序作為宿主。如果將應用寄宿于我們指定的宿主程序,這樣的寄宿方式被稱為Self-Host,接下來我們將通過一個具體的例子來演示如何定義一個簡單的ASP.NET MVC應用,并采用Self-Host的方式啟動它。

通過3個Hello World應用來了解ASP.NET 5應用是如何運行的(1)
通過3個Hello World應用來了解ASP.NET 5應用是如何運行的(2)
通過3個Hello World應用來了解ASP.NET 5應用是如何運行的(3)


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()