[水煮 ASP.NET Web API2 方法論](1-5)ASP.NET Web API Scaffolding(模板)

来源:http://www.cnblogs.com/shuizhucode/archive/2016/11/14/6060593.html
-Advertisement-
Play Games

問題 我們想快速啟動一個 ASP.NET Web API 解決方案。 解決方案 APS.NET 模板一開始就支持 ASP.NET Web API。使用模板往我們的項目中添加 Controller,在我們解決方案的 Controllers 文件夾上右鍵,選擇“添加”->"Scaffolding"。 即 ...


問題

  我們想快速啟動一個 ASP.NET Web API 解決方案。

 

解決方案

  APS.NET 模板一開始就支持 ASP.NET Web API。使用模板往我們的項目中添加 Controller,在我們解決方案的 Controllers 文件夾上右鍵,選擇“添加”->"Scaffolding"

  即用模式,可以從下麵選擇一個:

  • Web API2 Controller

  • Web API2 Controller with actions, using Entity Framework

  • Web API2 Controller with read/write actions

  • Web API2 OData Controller with action, using Entity Framwork

  另外,帶有屬性路由的基架模板可以從 NuGet 中下載。Install-Package Microsoft.AspNet.WebApi.ScaffolderTemplates.AttributeRouting.CSharp

 

工作原理

  模板功能的全名是 ASP.NET 模板(Scaffolding,他是一個基於 T4 模板的 ASP.NET 代碼生成框架。T4Text Template Transformation Toolkit,是一個代碼生成器模板,從 Visual Studio 2005 開始 T4 模板就已經Visual Studio 的一部分了。

  Visual Studio 2013 開始對模板的支持更加出色,允許我們快速生成 ASP.NET 應用程式代碼。在 Visual Studio 2013 更新 2 上,一些更具擴展性的功能點被添加進來,比如,模板的可定製化,這就讓我們使用他生成代碼的時候,更加靈活。

  內建模板是被安裝在 Visual Studio 安裝文件夾中,我們可以在這裡定製模板。例如,預設安裝的情況下,模板是在

C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\Extensions\Microsoft\Web\Mvc\Scaffolding\Templates 中。需要註意的是,修改任何模板之後,修改變更帶來的影響就是全局的。如果想在每個項目的基礎上自定義模板,可以通過下麵的兩種方式:

  • 安裝 SideWafflesidewaffle.com),他是 Visual Studion 模板管理的一個擴展程式。然後,使用常規的“添加”對話框,然後選擇“Web”->“SideWaffle”->“ASP.NET      Scaffolding T4”。將會在解決方案的文件夾中創建一個 “CodeTempplates” 文件夾,包括所有全局模板的副本,就可以根據我們的項目需要來修改他。

  • 手動的將所有全局模板複製到 ASP.NET 項目中“CodeTemplates”(名字很重要)文件夾中,該文件夾是在項目的根目錄中的一個文件夾。這些模板的副本中包含 C#  VB.NET 模板,但是,我們可以根據需要進行刪減。要確保文件這些文件已經包含到項目中。

代碼
 讓我們演示一個 Web API Controller Code-First 使用基礎模板處理的例子。

模型展示如列表 1-13

 

列表 1-13. EF Code-First

1 2 3 4 5 6 public class Team{     public int Id { getset; }     public string Name { getset; }     public DateTime FoundingDate { getset; }     public string LeagueName { getset; } }

 

  添加完模型之後,我們在處理模板對話框的時候,需要重新編譯項目。EF 是依賴於我們項目應用程式 DLL的反射。然後,選擇“添加”->Scaffolding->Web API->Web API 2 Controller with actions,using Entity Framework”。對話框如圖1-3

添加模板模板對話框

 

 

 1-3. 添加模板模板對話框。

 

  可以按照圖 1-4 的對話框來處理。必須許選擇一個模型,他是通過全名來限定的(這有一個可用的下拉框,會展示這個項所有的類),Entity Framework DataContext(如果有的話,會在下拉框中展示,也可以直接在這裡創建) 也是通過全名來限定,並且預設的控制器名稱也是和模型名稱一樣。我們可以檢查 Use async controller actions”選擇框來強制模板引擎生成非同步 action 和使用 EF DataContext 的非同步方法。

  生成的 Controller 如清單 1-14(為了節省空間,沒並沒有貼出命名空間)。這是一個完全可以訪問的HTTP url,請求會被預設路由識別匹配。這個創建的 ActionPOST)將會響應 201 狀態碼給調用端,並包含一個指向最新創建資源定位的頭。這個更新的 ActionPUT)甚至可能處理一個潛在的異常DbUpdateConcurrencyException.

清單 1-14. 通過模板生成使用 EF Action 的一個 Web API Controller

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 public class TeamsController : ApiController{     private ApressRecipesWebApiContext db = new ApressRecipesWebApiContext();     // GET: api/Teams    public IQueryable<Team> GetTeams()     {         return db.Teams;     }     // GET: api/Teams/5    [ResponseType(typeof(Team))]     public async Task<IHttpActionResult> GetTeam(int id)     {         Team team = await db.Teams.FindAsync(id);         if (team == null)         {             return NotFound();         }         return Ok(team);     }     // PUT: api/Teams/5    [ResponseType(typeof(void))]     public async Task<IHttpActionResult> PutTeam(int id, Team team)     {         if (!ModelState.IsValid)         {             return BadRequest(ModelState);         }         if (id != team.Id)         {             return BadRequest();         }         db.Entry(team).State = EntityState.Modified;         try        {             await db.SaveChangesAsync();         }         catch (DbUpdateConcurrencyException)         {             if (!TeamExists(id))             {                 return NotFound();             }             else            {                 throw;             }         }         return StatusCode(HttpStatusCode.NoContent);     }     // POST: api/Teams    [ResponseType(typeof(Team))]     public async Task<IHttpActionResult> PostTeam(Team team)     {         if (!ModelState.IsValid)         {             return BadRequest(ModelState);         }         db.Teams.Add(team);         await db.SaveChangesAsync();         return CreatedAtRoute("DefaultApi"new { id = team.Id }, team);     }     // DELETE: api/Teams/5    [ResponseType(typeof(Team))]     public async Task<IHttpActionResult> DeleteTeam(int id)     {         Team team = await db.Teams.FindAsync(id);         if (team == null)         {             return NotFound();         }         db.Teams.Remove(team);         await db.SaveChangesAsync();         return Ok(team);     }     protected override void Dispose(bool disposing)     {         if (disposing)         {             db.Dispose();         }         base.Dispose(disposing);     }     private bool TeamExists(int id)     {         return db.Teams.Count(e => e.Id == id) > 0;     } }

 

  現在,假設我們已經按照“工作原理”部分描述的方式,在我們的解決方案中添加了基架模板。但是,我們還是希望可以按照自己的方式定義它。例如,強制所有新建的 ASP.NET Web Api 控制器類繼承一個指定的基類,如清單 1-15 所示。我們需要修改  CodeTemplates/ApiControllerEmpty 文件夾中的 Controller.cs.t4文件,以確保每一個新的 Controller 不再繼承自 ApiController,而是成為 ApiBaseController 的子類,這是一個在大項目中典型的需求,因為很多 Web API 開發者喜歡採用自己的基類作為新的 Controller 的基類。

清單1-15. 通過模板強制新建的 Web API Controller 總是繼承自 ApiBaseController

1 2 3 4 5 6 7 8 9 10 11 12 13 14 <#@ template language="C#" HostSpecific="True" #> <#@ output extension="cs" #> <#@ parameter type="System.String" name="ControllerName" #> <#@ parameter type="System.String" name="Namespace" #> using System;using System.Collections.Generic; using System.Linq;using System.Net; using System.Net.Http; using System.Web.Http; namespace <#= Namespace #> {     public class <#= ControllerName #> : ApiBaseController     {     } }

 

  如果現在來“添加”->Scaffolding->Web API->Web API2 Controller Empty”,生成的代碼如清單1-16 所示,繼承自 ApiBaseController 而不是 ApiCnotroller

清單1-16. 根據自定義模板生成的 Controller

Listing 1-16. A Controller Generated from the Customized Scaffolding Template

1 2 3 4 5 using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Net.Http;using System.Web.Http;namespace Apress.Recipes.WebApi.Controllers {     public class SampleController : ApiBaseController    {     } }

  我們可以在更廣泛的範圍去使用這個定製化的技術,自定義命名空間,註入自己的服務,或者強制 action是非同步的。

 小提示 不僅僅修改現有的,也可以添加新的,完全獨立的模板。我們可以在學習更多官方的 .NET Web Development  Tools 小組的小組的博客,請戳這裡

https://blogs.msdn.microsoft.com/webdev/2014/04/03/creating-a-custom-scaffolder-for-visual-studio/


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、環境部署: windows server 2008R2環境 2、相關軟體 SVN(源代碼管理器:jenkins通過插件從源代碼管理器下載代碼) Jenkins(主角)地址:http://ftp.yz.yamagata-u.ac.jp/pub/misc/jenkins/windows-stable ...
  • ReSharper 10.0.0.1 Ultimate 完美破解補丁使用方法,本資源來自互聯網,感謝吾樂吧軟體站的分享。 ReSharper是一款由jetbrains開發的針對C#, VB.NET, ASP.NET, XML, 和 XAML的編輯器。沿襲了jetbrains開發工具一貫的優良傳統,R ...
  • 添加引用時生成”勾選允許生成非同步操作” Wcf非同步調用三種方式: 第一種:直接調用非同步方法 var serviceClient = new MyServiceClient(); serviceClient.MessageAsync(); erviceClient.Close(); 第二種:Begin ...
  • 一、MessageBox的Buttons MessageBox.Show可以出現有按鈕的對話框 例如: DialogResult dr = MessageBox.Show("是否要繼續嗎?", "警告!!!", MessageBoxButtons.OKCancel);//它彈出的對話框如下圖所示if ...
  • 一、客戶端設計思路 1.理順設計思路,架構框架 2.設計界面 3.編寫後臺代碼 4.資料庫訪問 二、公共控制項 1、Button(按鈕): ⑴ Enabled :確定是否啟用控制項 ⑵ Visible:確定控制項是否課件; 2、CheckBox(多選項) 、CheckListBox -(多選項列表) 3、 ...
  • Asp.Net MVC4 BundleConfig文件合併、壓縮,網站優化加速 Asp.Net MVC4 BundleConfig文件合併、壓縮,網站優化加速 瀏覽器在向伺服器發送請求的時候,請求的文件鏈接數量是有限制的,如果頁面文件少就沒有什麼問題了,如果文件太多就會導致鏈接失敗等等問題。針對這個 ...
  • C# 知識回顧 - 事件入門 【博主】反骨仔 【原文】http://www.cnblogs.com/liqingwen/p/6057301.html 序 之前通過《C# 知識回顧 - 委托 delegate》、《C# 知識回顧 - 委托 delegate (續)》介紹了委托的基本知識,這次我們來看看 ...
  • ASP.NET Core管道雖然在結構組成上顯得非常簡單,但是在具體實現上卻涉及到太多的對象,所以我們在 “通過重建Hosting系統理解HTTP請求在ASP.NET Core管道中的處理流程”(上篇、中篇、下篇) 中圍繞著一個經過極度簡化的模擬管道講述了真實管道構建的方式以及處理HTTP請求的流程... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...