您好,登錄后才能下訂單哦!
問題
我們想快速啟動一個 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 代碼生成框架。T4(Text Template Transformation Toolkit),是一個代碼生成器模板,從 Visual Studio 2005 開始 T4 模板就已經(jīng) Visual Studio 的一部分了。
Visual Studio 2013 開始對模板的支持更加出色,允許我們快速生成 ASP.NET 應(yīng)用程序代碼。在 Visual Studio 2013 更新 2 上,一些更具擴展性的功能點被添加進來,比如,模板的可定制化,這就讓我們使用他生成代碼的時候,更加靈活。
內(nèi)建模板是被安裝在 Visual Studio 安裝文件夾中,我們可以在這里定制模板。例如,默認安裝的情況下,模板是在
C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\Extensions\Microsoft\Web\Mvc\Scaffolding\Templates 中。需要注意的是,修改任何模板之后,修改變更帶來的影響就是全局的。如果想在每個項目的基礎(chǔ)上自定義模板,可以通過下面的兩種方式:
安裝 SideWaffle(sidewaffle.com),他是 Visual Studion 模板管理的一個擴展程序。然后,使用常規(guī)的“添加”對話框,然后選擇“Web”->“SideWaffle”->“ASP.NET Scaffolding T4”。將會在解決方案的文件夾中創(chuàng)建一個 “CodeTempplates” 文件夾,包括所有全局模板的副本,就可以根據(jù)我們的項目需要來修改他。
手動的將所有全局模板復(fù)制到 ASP.NET 項目中“CodeTemplates”(名字很重要)文件夾中,該文件夾是在項目的根目錄中的一個文件夾。這些模板的副本中包含 C# 和 VB.NET 模板,但是,我們可以根據(jù)需要進行刪減。要確保文件這些文件已經(jīng)包含到項目中。
代碼
讓我們演示一個 Web API Controller
Code-First 使用基礎(chǔ)模板處理的例子。
模型展示如列表 1-13。
列表 1-13. EF Code-First
public class Team{ public int Id { get; set; } public string Name { get; set; } public DateTime FoundingDate { get; set; } public string LeagueName { get; set; } }
添加完模型之后,我們在處理模板對話框的時候,需要重新編譯項目。EF 是依賴于我們項目應(yīng)用程序 DLL 的反射。然后,選擇“添加”->“Scaffolding”->“Web API”->“Web API 2 Controller with actions,using Entity Framework”。對話框如圖1-3。
圖 1-3. 添加模板模板對話框。
可以按照圖 1-4 的對話框來處理。必須許選擇一個模型,他是通過全名來限定的(這有一個可用的下拉框,會展示這個項所有的類),Entity Framework DataContext(如果有的話,會在下拉框中展示,也可以直接在這里創(chuàng)建) 也是通過全名來限定,并且默認的控制器名稱也是和模型名稱一樣。我們可以檢查 “Use async controller actions”選擇框來強制模板引擎生成異步 action 和使用 EF DataContext 的異步方法。
生成的 Controller 如清單 1-14(為了節(jié)省空間,沒并沒有貼出命名空間)。這是一個完全可以訪問的 HTTP url,請求會被默認路由識別匹配。這個創(chuàng)建的 Action(POST)將會響應(yīng) 201 狀態(tài)碼給調(diào)用端,并包含一個指向最新創(chuàng)建資源定位的頭。這個更新的 Action(PUT)甚至可能處理一個潛在的異常 DbUpdateConcurrencyException.
清單 1-14. 通過模板生成使用 EF Action 的一個 Web API Controller
public class TeamsController : ApiController{ private Apre***ecipesWebApiContext db = new Apre***ecipesWebApiContext(); // 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; } }
現(xiàn)在,假設(shè)我們已經(jīng)按照“工作原理”部分描述的方式,在我們的解決方案中添加了基架模板。但是,我們還是希望可以按照自己的方式定義它。例如,強制所有新建的 ASP.NET Web Api 控制器類繼承一個指定的基類,如清單 1-15 所示。我們需要修改 CodeTemplates/ApiControllerEmpty 文件夾中的 Controller.cs.t4文件,以確保每一個新的 Controller 不再繼承自 ApiController,而是成為 ApiBaseController 的子類,這是一個在大項目中典型的需求,因為很多 Web API 開發(fā)者喜歡采用自己的基類作為新的 Controller 的基類。
清單1-15. 通過模板強制新建的 Web API Controller 總是繼承自 ApiBaseController
<#@ 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 { } }
如果現(xiàn)在來“添加”->“Scaffolding”->“Web API”->“Web API2 Controller Empty”,生成的代碼如清單1-16 所示,繼承自 ApiBaseController 而不是
ApiCnotroller。
清單1-16. 根據(jù)自定義模板生成的 Controller
Listing 1-16. A Controller Generated from the Customized Scaffolding Template
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 { } }
我們可以在更廣泛的范圍去使用這個定制化的技術(shù),自定義命名空間,注入自己的服務(wù),或者強制 action 是異步的。
小提示 不僅僅修改現(xiàn)有的,也可以添加新的,完全獨立的模板。我們可以在學(xué)習(xí)更多官方的 .NET Web Development 和 Tools 小組的小組的博客,請戳這里
https://blogs.msdn.microsoft.com/webdev/2014/04/03/creating-a-custom-scaffolder-for-visual-studio/
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。