問題
成都創(chuàng)新互聯(lián)公司專注于企業(yè)網(wǎng)絡營銷推廣、網(wǎng)站重做改版、玉泉網(wǎng)站定制設計、自適應品牌網(wǎng)站建設、HTML5建站、商城開發(fā)、集團公司官網(wǎng)建設、外貿網(wǎng)站建設、高端網(wǎng)站制作、響應式網(wǎng)頁設計等建站業(yè)務,價格優(yōu)惠性價比高,為玉泉等各大城市提供網(wǎng)站開發(fā)制作服務。
我們想快速啟動一個 ASP.NETWeb API解決方案。
解決方案
APS.NET模板一開始就支持 ASP.NETWeb 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應用程序代碼。在 Visual Studio 2013更新 2上,一些更具擴展性的功能點被添加進來,比如,模板的可定制化,這就讓我們使用他生成代碼的時候,更加靈活。
內建模板是被安裝在Visual Studio安裝文件夾中,我們可以在這里定制模板。例如,默認安裝的情況下,模板是在
C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\Extensions\Microsoft\Web\Mvc\Scaffolding\Templates中。需要注意的是,修改任何模板之后,修改變更帶來的影響就是全局的。如果想在每個項目的基礎上自定義模板,可以通過下面的兩種方式:
安裝SideWaffle(sidewaffle.com),他是 Visual Studion模板管理的一個擴展程序。然后,使用常規(guī)的“添加”對話框,然后選擇“Web”->“SideWaffle”->“ASP.NET Scaffolding T4”。將會在解決方案的文件夾中創(chuàng)建一個 “CodeTempplates”文件夾,包括所有全局模板的副本,就可以根據(jù)我們的項目需要來修改他。
手動的將所有全局模板復制到 ASP.NET項目中“CodeTemplates”(名字很重要)文件夾中,該文件夾是在項目的根目錄中的一個文件夾。這些模板的副本中包含 C#和 VB.NET模板,但是,我們可以根據(jù)需要進行刪減。要確保文件這些文件已經(jīng)包含到項目中。
代碼
讓我們演示一個Web API Controller
Code-First使用基礎模板處理的例子。
模型展示如列表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是依賴于我們項目應用程序 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)將會響應 201狀態(tài)碼給調用端,并包含一個指向最新創(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)在,假設我們已經(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 { } }
我們可以在更廣泛的范圍去使用這個定制化的技術,自定義命名空間,注入自己的服務,或者強制 action是異步的。
小提示不僅僅修改現(xiàn)有的,也可以添加新的,完全獨立的模板。我們可以在學習更多官方的 .NET Web Development和Tools小組的小組的博客,請戳這里
https://blogs.msdn.microsoft.com/webdev/2014/04/03/creating-a-custom-scaffolder-for-visual-studio/
網(wǎng)頁題目:[水煮ASP.NETWebAPI2方法論](1-5)ASP.NETWebAPIScaffolding(模板)
當前地址:http://muchs.cn/article14/ghedge.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供移動網(wǎng)站建設、App開發(fā)、標簽優(yōu)化、網(wǎng)站制作、定制開發(fā)、面包屑導航
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)