本文章是由機器翻譯。

程式設計師雜談

Oak 入門:不同的方法

Ted Neward

如上所述最後一次了,橡木專案是一個 Web 框架,包含了動態方面和辦法共同更多動態-­基於語言的框架 (如 Ruby on Rails 或任何 Node.js 的各種 MVC Web 框架、 快遞或塔等)。因為它基於 Microsoft.NET 框架,並使用動態和動態語言運行時 (DLR) 部分的 C# 中,橡樹採用相當不同的方法來開發 Web 應用程式從那些由傳統ASP.NETMVC 開發人員使用。為此原因,當你發現最後一次中, 必要的位做橡木發展是比只拉扯它通過 NuGet 有點更複雜。

假設你讀過的前一列 (msdn.microsoft.com/magazine/dn451446)、 下載位、 安裝它們,踢出連續的生成助手和得到 (在 IIS Express,作為你召回 3000,埠),您的機器上運行時候開始,致力於發展在橡樹的初始生成。

射擊了

如果它不運行在您的框上,做"耙子"和"耙伺服器"從命令提示符處,只是,以確保一切都是品質好。然後啟動"陪襯"(如果它尚未運行),並打開 localhost:3000,瀏覽器中所示圖 1


圖 1 橡木專案説明視窗

由此產生的教程顧名思義,有一種的麵包屑式演練學習橡樹。我進它之前,雖然,帶中顯示的專案結構快速看圖 2


圖 2 橡木專案結構Visual Studio的解決方案資源管理器中

種子專案包括兩個專案:ASP.NETMVC 專案和解決方案的測試專案。MVC 專案是一個傳統的ASP.NETMVC 應用程式,與添加的"橡樹"資料夾中包含原始檔案組成專案的橡木部分。這使得它完全微不足道的以在調試期間,逐句通過代碼的橡木部分,並且在所有的開放源碼專案的精神,並在必要時還使的本地修改。目前,該專案有沒有模型、 三個控制器和幾個意見。更重要的是,因為沒有太多的代碼在這裡,到終結點的第一個請求產生錯誤的沒有"Index.cshtml"(或類似) 存在的視圖。橡木引導程式表明兩個步驟。首先,您需要創建兩個新的類型:博客和博客,博客實例的集合。調用類"博客"可以很容易的、 基於公約 》 訪問博客資料庫的表中:

public class Blogs : DynamicRepository
{
}
// This is a dynamic entity that represents the blog
public class Blog : DynamicModel
{
  public Blog() { }
  public Blog(object dto) : base(dto) { }
}

第二,HomeController 需要一些更改,以便能夠回應不同的 HTTP 要求發送,如中所示圖 3

圖 3 對不同的 HTTP 要求的回應

public class HomeController : Controller
{
  // Initialize the blog
  Blogs blogs = new Blogs();
  public ActionResult Index()
  {
    // Return all blogs from the database
    ViewBag.Blogs = blogs.All();
    return View();
  }
  // Controller action to save a blog
  [HttpPost]
  public ActionResult Index(dynamic @params)
  {
    dynamic blog = new Blog(@params);

這將為ASP.NET開發人員所熟悉。驚人地不同的是一切都類型作為 C# 動態類型,不是作為博客或博客實例。博客類型本身沒有任何欄位或屬性。博客類型 — — 聚合博客實例 — — 同樣有沒有代碼宣佈它來插入、 刪除、 清單、 替換或做任何其他操作通常與集合相關聯。

很多這種力量來自基於動態的雙子座庫,橡木專案的核心部分 (和我的 2013 年 8 月專欄、"會動態與雙子座圖書館,"的主題在 msdn.microsoft.com/magazine/dn342877)。博客擴展 DynamicModel 基類,這實質上意味著你可以對它程式設計,而無需定義前面的模型。您對任何給定的博客實例引用的任何欄位將會在那裡,即使你從來沒有引用它之前。這就是動態程式設計的力量。同樣,博客是 DynamicRepository。為此,它已經知道如何存儲和操作 DynamicModel 物件。

甚至更有趣是不是現成的橡樹知道如何存儲到 SQL 表 (命名為,不出意料,"博客") 的博客實例。不僅首次使用,它將創建資料庫架構,它可以"種子",系統可能需要的任何啟動資料與資料庫。

當你構建一個博客實例時,它採用一個動態物件作為參數。基類建構函式知道如何在該物件上步行通過任何動態定義的欄位屬性。同樣,博客實例也會知道如何逐一查看所有動態定義欄位/屬性的一個博客實例。它會將它們存儲到資料庫 (在對博客的調用。插入)。它也知道如何通過 BlogId 欄位從資料庫中檢索博客實例。所有這一切中的代碼由供電圖 3; 沒有額外的模型代碼是必要的 — — 至少,尚未。(還有其他的事要有,但現在,它都只是工作。

順便說一句如果你想知道什麼 @ 運算子,記得 params 是實際上在 C# 中的保留的字。為了使用它作為一個可接受的參數的名稱,您必須作為它與 @ 首碼告訴 C# 編譯器不把它當作一個關鍵字。

有修改 HomeController.cs 下, 一步是創建一個可接受的看法,Index.cshtml,在視圖資料夾下的主資料夾中。這將顯示控制器的工作的結果,如中所示圖 4

圖 4 創建視圖

@{
  ViewBag.Title = "Index";
}
<h2>Hello World</h2>
<div>

如果此頁面成功地來,你做很好 ! 去吧,創建一個博客 (嘗試創建具有重複名稱的博客)。

</div>
<br />
@using (Html.BeginForm()) 
{
  @Html.TextBox("Name")
  <input type="submit" value="create" />
}
@foreach (var blog in ViewBag.Blogs)
{
  <div>
    <pre>@blog</pre>
    <br />
    <div>
Almost there, you have comments listing; let's try to add one.
</div>
    <br />
  </div>
}

表面上看,認為不只是另一個ASP.NET視圖。再次,該系統的動態性質來發揮。沒有博客實例定義的名稱的欄位上的博客類型,但當提交表單頂部的視圖時,"名稱 =..."參數將在傳遞給 HomeController。此控制器然後將通過在 @params 變數用來初始化一個博客實例中的名稱/值對。沒有任何額外的工作上您的部件,博客實例現在上有一個名稱欄位屬性。

連續相續

順便說一句,如果你在玩這個遊戲的家庭版,你保存這些檔,您會看到一些有趣的事情發生了 (見圖 5)。


圖 5 的咆哮聲通知顯示生成已成功

首先,通知在右下角彈出。這是在工作的咆哮聲。它給你的序幕的是你較早前推出的助手應用程式的生成已成功的綠色指示燈通知。如果由於某種原因失敗,左邊的通知視窗中的圖形將是紅色的和主控台輸出將顯示在通知中。第二,如果你看的主控台視窗中的助手正在運行時,它將明顯發生了什麼事。博客目錄中的檔案系統觀察程式註冊原始檔案更改 (因為您保存它)。助手們認為這是一個提示,重新生成專案。

假設在保存檔,並且該代碼是正確的再打 localhost:3000 生成的新結果,所示圖 6


圖 6 橡木能無粘土磚

這一次,橡樹試圖連接到正在運行的SQL Server實例以從那表 (博客表) 中獲取的任何資料。這是橡樹自動想要管理的專案代表您的物件-關係映射 (ORM) 部分,入那接下來的時間我會進一步。

不同的樣式

正如您所看到的使用橡木肯定涉及不同風格的發展。在沒有點你要做什麼Visual Studio中打開比任何時候都更複雜的檔,更改它的內容和保存新版本 — — 並向專案中添加一個新的檔。在沒有點你過踢掉生成、 運行它從Visual Studio內, 或打開伺服器資源管理器來創建表或SQL Server腳本揭開序幕。

所有這些事情您仍然可以使用,應該需要出現。再次,橡木是只是一層 (和一種相當薄) 在傳統ASP.NET堆疊的頂部。然而,這一層允許一定程度的快速發展和生產力類似于其他更有活力的環境,而不會丟失你喜歡從靜態類型化世界的事情。

還有更多要做與橡木,但這仍是今後討論的主題。

編碼愉快 !

Ted Neward 是的校長 Neward & 同夥 LLC。他已寫一百多篇和創作和合著十幾本書,其中包括"專業 F # 2.0"(Wrox,2010年)。他是 F # 最有價值球員,並在世界各地的會議上講話。他徵求意見,並定期導師 — — 聯繫到他在 ted@tedneward.com 如果你感興趣讓他來與您的團隊一起工作或閱讀他的博客在 blogs.tedneward.com

衷心感谢以下技术专家对本文的审阅:埃米爾 Rajan (橡木專案建立者)