標籤:部落格 技術 執行個體 mvc wcf
伴隨著春姑娘調皮的腳步,小編接手的檔案管理項目也漸漸步入正軌,從開始的需求分析,到使用Axure畫原型圖,再到使用powerdesigner設計實體,產生資料庫,一直到昨天剛剛通了一條線,這一路走來,小編懂得了很多,無路學習還是和團隊小夥伴的交流合作,有時候,總是會因為大家意見不統一,搞的大家吹鬍子瞪眼,但有時也會因為某件事情圓滿成功而歡欣鼓舞,小組中最開心的事兒莫過於有人開會遲到買吃的了,哈哈,暴露了小編的本質,開頭說了這麼多,接下來,小編就跟分享一下,如果利用TT模板+mvc+wcf實現簡單查詢,有不同意見的小夥伴歡迎討論交流......
首先,搭建好架構,分別為mvc,wcf,B,D,在這裡說明一下在這裡我們使用TT模板,TT模板好陌生的名字,小編以前都不知道在這個世界上有她的存在,再此,對不住了TT,TT在背後默默無聞的奉獻著,猶如蠟燭,燃燒自己照亮別人,直到這次接手項目,小編才有幸見到她猶抱琵琶半遮面的神奇,小編簡單來介紹一下TT模板,也叫T4模板,全稱Text Template Transformation Toolkit是微軟官方在VisualStudio 2008中開始使用的代碼產生引擎。在 Visual Studio 中,“T4 文本模板”是由一些文字區塊和控制邏輯組成的混合模板,它可以產生文字檔。 在 Visual C# 或 Visual Basic 中,控制邏輯編寫為程式碼的片段。產生的檔案可以是任何類型的文本,例如網頁、資源檔或任何語言的程式原始碼。現在的VS中只要與代碼產生相關的情境基本上都能找T4的身影,比如MVC的視圖模板,Entity Framwork的DataContext模板等等。所以B層和D層都是產生好的,不需要我們自己再動手敲了,搭建好的架構如下所示:
好的,接下來,小編就開始著手敲代碼了,第一步,我們需要在服務契約裡面建立介面,定義方法,代碼如下所示:
<span style="font-size:18px;">using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Runtime.Serialization;using System.ServiceModel;using ITOO.Archives.Contracts;namespace ITOO.Archives.Contracts{ //服務合約定義 [ServiceContract] public interface IQuery { //要公開的服務方法 [OperationContract] //定義一個查詢的方法 List<Query> query(); }}</span> 第二步:在總結口後面加上逗號和剛才在服務契約裡面寫的介面,代碼如下所示:
<span style="font-size:18px;"><span style="font-size:18px;">using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Runtime.Serialization;using System.ServiceModel;namespace ITOO.Archives.Contracts{ //服務合約定義 [ServiceContract] //在總介面後面寫上相應的分介面,具體實現寫在分介面 public interface IArchivesService : ITest,IQuery { }}</span></span> 第三步:在服務工廠中添加方法,得到該介面的方法,代碼如下所示:
<span style="font-size:18px;">using System;using System.Collections.Generic;using System.Linq;using System.Runtime.Serialization;using System.Text;using ITOO.Archives.Contracts;namespace ITOO.Archives.Contracts{ public class ServiceFactory { private static readonly SortedList<string, IArchivesService> _serviceBusiness = new SortedList<string, IArchivesService>(); #region 基礎方法 /// <summary> /// 擷取中心管理系統所有的業務方法 /// </summary> /// <param name="endpointName"></param> /// <returns></returns> public static IArchivesService GetServiceBusiness(string endpointName) { IArchivesService iServices; iServices = CreateWCFInterface(endpointName); if (_serviceBusiness.ContainsKey(endpointName)) { iServices = _serviceBusiness[endpointName]; } else { if (true) { iServices = CreateWCFInterface(endpointName); } else { //暫時不用 // iServices = CreateLocalInterface(); } _serviceBusiness.Add(endpointName, iServices); } return iServices; } private static IArchivesService CreateWCFInterface(string endpointName) { return ServiceProxyFactory.Create<IArchivesService>(endpointName); } /// <summary> /// /// </summary> /// <typeparam name="T">介面</typeparam> /// <returns></returns> public static T Create<T>() { return (T)GetServiceBusiness("Service"); } /// <summary> /// /// </summary> /// <typeparam name="T">介面</typeparam> /// <param name="endpointName"></param> /// <returns></returns> public static T Create<T>(string endpointName) { // WuliuFactory.Create<IWlTool>("wuliu") return (T)GetServiceBusiness(endpointName); } #endregion #region 實體服務 /// <summary> /// 學生資訊 /// </summary> /// <returns></returns> public static ITest GetAllrecordSchoolCensusManage() { return GetServiceBusiness("BasicHttpBinding_Services"); } #endregion #region 實體服務 /// <summary> /// 異動表資訊 /// </summary> /// <returns></returns> public static IQuery GetRecordChange() { return GetServiceBusiness("BasicHttpBinding_Services"); } /// <summary> /// 檔案借閱資訊 /// </summary> /// <returns></returns> public static ITestTwo GetRecordBorrow() { return GetServiceBusiness("BasicHttpBinding_Services"); } #endregion }}</span> 第四步:寫資料契約,小編理解的這塊就跟我們當時敲三層的時候中的實體層特別相似,代碼如下:
<span style="font-size:18px;">using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Runtime.Serialization;namespace ITOO.Archives.Contracts{ [DataContract] public class Query { //資料契約(DataContract) 服務契約定義了遠端存取對象和可供調用的方法,資料契約則是服務端和用戶端之間要傳送的自訂資料類型,一旦聲明一個類型為DataContract,那麼該類型就可以被序列化在服務端和用戶端之間傳送 [DataMember] public string name { get; set; } [DataMember] public string ratity { get; set; } [DataMember] public string reason { get; set; } [DataMember] public string sex { get; set; } [DataMember] public string studentID { get; set; } [DataMember] public string time { get; set; } [DataMember] public string type { get; set; } }}</span> 第五步:在WcfService中建立類實現契約裡面的方法,代碼如下所示:
<span style="font-size:18px;">/************************************************* 丁國華小組: ArchivesModel說明:測試小例子建立日期:2015年2月6日 14:46:27版本號碼:1.0**********************************************/using System;using System.Collections.Generic;using System.Linq;using System.Web;using ITOO.Archives.BLL;using ITOO.Archives.Model;using ITOO.Archives.DAL;using ITOO.Library.Core;using ITOO.Archives.Contracts;using ITOO.Archives.IBLL;using ITOO.Archives.BLLFactory;using AutoMapper;namespace ITOO.Archives.WCFService{ public partial class ArchivesService : IQuery { /// <summary> /// 查詢檔案借閱情況 /// </summary> /// <returns></returns> public List<Query> query() { List<Query> listQuery = new List<Query>(); //工廠建立B層 IT_recordChangeBLL recBLL = BLLAbstractFactory.GetT_recordChangeBLL(); //建立一個關係 Mapper.CreateMap<T_recordChange, Query>(); //調用底層方法 var result = recBLL.LoadEnities(u => u.name != "0").ToList(); //轉換實體(實體的屬性名稱、資料類型必須一樣) listQuery = Mapper.Map<List<T_recordChange>, List<Query>>(result); return listQuery; } }}</span> 第六步:這個時候開始著手寫前端代碼,建立控制器,代碼如下所示:
<span style="font-size:18px;">using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;using System.Text;using ITOO.Archives.Contracts;namespace ITOO.Archives.Client.Controllers{ public class queryController : Controller { //調用ServiceFactory的GetRecordChange方法 private IQuery queryService = ServiceFactory.GetRecordChange(); // public ActionResult queryIndex() { List<Query> listResult = queryService.query(); ViewData["data"] = listResult; return View(); } }}</span> 第七步:添加視圖+前端代碼,如下所示:
<span style="font-size:18px;">@{ }<script type="text/javascript" src="../../Scripts/KongJianJS/KongJianJS.js"></script><script type="text/javascript" src="../../Scripts/KongJianJS/KongJianJS.js"></script><script src="../../Scripts/CourseTypeJS/js/jquery.easyui.min.js" type="text/javascript" ></script><script src="../../Content/jquery-easyui-1.3.2/locale/easyui-lang-zh_CN.js"></script><link rel="stylesheet" type="text/css" href="../../Scripts/CourseTypeJS/js/css/easyui/icon.css"/><link rel="stylesheet" type="text/css" href="../../Scripts/CourseTypeJS/js/css/common/common.css"/><link href="../../Content/index.css" rel="stylesheet" /><link href ="../../CSS/index.css" rel ="stylesheet"/><h2>queryIndex</h2><div> <table id="dg" class="easyui-datagrid" style="width: 600px; height: 300px" > <thead> <tr> <th data-options="field:'name',width:148,sortable:true">ID</th> <th data-options="field:'ratity',width:148,sortable:true">姓名</th> <th data-options="field:'reason',width:148,sortable:true">性別</th> <th data-options="field:'sex',width:148,sortable:true">呵呵</th> <th data-options="field:'studentID ',width:148,sortable:true">哈哈</th> <th data-options="field:'time',width:148,sortable:true">嘿嘿</th> <th data-options="field:'type',width:148,sortable:true">嘻嘻</th> </tr> </thead> @foreach (ITOO.Archives.Contracts.Query enQuery in ViewData["data"] as List<ITOO.Archives.Contracts.Query>) { <tr> <td>@enQuery.name </td> <td>@enQuery.ratity </td> <td>@enQuery.reason </td> <td>@enQuery.sex </td> <td>@enQuery.studentID </td> <td>@enQuery.time </td> <td>@enQuery.type </td> </tr> } </table> </div> </span> 還有一個特別需要提醒各位小夥伴的是,由於這個不能單個把某個頁面設成起始頁,那如果我們完成某個小功能的時候,想要看看運行效果怎麼辦呢?代碼設定如下:
<span style="font-size:18px;">using System;using System.Collections.Generic;using System.Data.Entity;using System.Data.Entity.Infrastructure;using System.Linq;using System.Web;using System.Web.Mvc;using System.Web.Routing;namespace ITOO.Archives.Client{ // 注意: 有關啟用 IIS6 或 IIS7 傳統模式的說明, // 請訪問 http://go.microsoft.com/?LinkId=9394801 public class MvcApplication : System.Web.HttpApplication { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new HandleErrorAttribute()); } public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); //routes.MapRoute( // "Default", // 路由名稱 // "{controller}/{action}/{id}", // 帶有參數的 URL // new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 參數預設值 //); routes.MapRoute( "Default", // 路由名稱 "{controller}/{action}/{id}", // 帶有參數的 URL new { controller = "query", action = "queryIndex", id = UrlParameter.Optional } ); //routes.MapRoute( // "Default", // 路由名稱 // "{controller}/{action}/{id}", // 帶有參數的 URL // new { controller = "testTwo", action = "testTwoIndex", id = UrlParameter.Optional } //); } protected void Application_Start() { AreaRegistration.RegisterAllAreas(); // 預設情況下對 Entity Framework 使用 LocalDB Database.DefaultConnectionFactory = new SqlConnectionFactory(@"Data Source=(localdb)\v11.0; Integrated Security=True; MultipleActiveResultSets=True"); RegisterGlobalFilters(GlobalFilters.Filters); RegisterRoutes(RouteTable.Routes); } }}</span> 至此一個使用TT模板+mvc+wcf實現一個簡單查詢的例子就完成了,效果如下:
資料庫中的資料是小編瞎添加的,不規範,還請各位小夥伴見諒。
小編寄語:該博文主要跟大家分享一下小編在做項目過程中收穫的點點滴滴,對於wcf和mvc的理解還很淺,有待繼續學習,有不同意見的小夥伴還請多多指教,利用TT模板和mvc以及wcf實現簡單的查詢,說實話,剛開始的時候真的不會,又有種那個時候敲機房的感覺,憋了好長時間,終於一條線通了,高興ing,檔案管理項目,未完待續......
使用TT模板+mvc+wcf實現簡單查詢