博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用TT模板+mvc+wcf实现简单查询
阅读量:6094 次
发布时间:2019-06-20

本文共 9547 字,大约阅读时间需要 31 分钟。

       今天是除夕,小编的这篇博客是掐着点儿发的,在此,祝各位小伙伴新年快乐,身体健康,万事如意;喜从天降,欣喜若狂;喜气盈门,好事成双;好人好运,金玉满堂;神采飞扬,如愿以偿,财源滚滚来,福如东海长;伴随着除夕的脚步,小编接手的档案管理项目也渐渐步入正轨,从开始的需求分析,到使用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层都是生成好的,不需要我们自己再动手敲了,搭建好的框架如下所示:

        

        好的,接下来,小编就开始着手敲代码了,第一步,我们需要在服务契约里面建立接口,定义方法,代码如下所示:

        

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(); }}
        第二步:在总结口后面加上逗号和刚才在服务契约里面写的接口,代码如下所示:

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    {    }}
       第三步:在服务工厂中添加方法,得到该接口的方法,代码如下所示:

       

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
_serviceBusiness = new SortedList
(); #region 基础方法 ///
/// 获取中心管理系统所有的业务方法 /// ///
///
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
(endpointName); } ///
/// /// ///
接口
///
public static T Create
() { return (T)GetServiceBusiness("Service"); } ///
/// /// ///
接口
///
///
public static T Create
(string endpointName) { // WuliuFactory.Create
("wuliu") return (T)GetServiceBusiness(endpointName); } #endregion #region 实体服务 ///
/// 学生信息 /// ///
public static ITest GetAllrecordSchoolCensusManage() { return GetServiceBusiness("BasicHttpBinding_Services"); } #endregion #region 实体服务 ///
/// 异动表信息 /// ///
public static IQuery GetRecordChange() { return GetServiceBusiness("BasicHttpBinding_Services"); } ///
/// 档案借阅信息 /// ///
public static ITestTwo GetRecordBorrow() { return GetServiceBusiness("BasicHttpBinding_Services"); } #endregion }}
        第四步:写数据契约,小编理解的这块就跟我们当时敲三层的时候中的实体层特别相似,代码如下:

        

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; }            }}
       第五步:在WcfService中创建类实现契约里面的方法,代码如下所示:

       

/************************************************* 作者:丁国华小组:  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    {        ///         /// 查询档案借阅情况        ///         /// 
public List
query() { List
listQuery = new List
(); //工厂创建B层 IT_recordChangeBLL recBLL = BLLAbstractFactory.GetT_recordChangeBLL(); //创建一个关系 Mapper.CreateMap
(); //调用底层方法 var result = recBLL.LoadEnities(u => u.name != "0").ToList(); //转换实体(实体的属性名称、数据类型必须一样) listQuery = Mapper.Map
, List
>(result); return listQuery; } }}
        第六步:这个时候开始着手写前端代码,创建控制器,代码如下所示:

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
listResult = queryService.query(); ViewData["data"] = listResult; return View(); } }}
        第七步:添加视图+前端代码,如下所示:

         

@{    }

queryIndex

) {
@foreach (ITOO.Archives.Contracts.Query enQuery in ViewData["data"] as List
}
ID 姓名 性别 呵呵 哈哈 嘿嘿 嘻嘻
@enQuery.name @enQuery.ratity @enQuery.reason @enQuery.sex @enQuery.studentID @enQuery.time @enQuery.type
        还有一个特别需要提醒各位小伙伴的是,由于这个不能单个把某个页面设成起始页,那如果我们完成某个小功能的时候,想要看看运行效果怎么办呢?代码设置如下:

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);        }    }}
        至此一个使用TT模板+mvc+wcf实现一个简单查询的例子就完成了,效果如下:

        

        数据库中的数据是小编瞎添加的,不规范,还请各位小伙伴见谅。

        小编寄语:该博文主要跟大家分享一下小编在做项目过程中收获的点点滴滴,对于wcf和mvc的理解还很浅,有待继续学习,有不同意见的小伙伴还请多多指教,利用TT模板和mvc以及wcf实现简单的查询,说实话,刚开始的时候真的不会,又有种那个时候敲机房的感觉,憋了好长时间,终于一条线通了,高兴ing,档案管理项目,未完待续......

你可能感兴趣的文章
Android与Gradle(二):插件打包上传到Maven服务器
查看>>
vue注册事件 -防止多次点击
查看>>
JS隐式转换--宽松相等(==)
查看>>
Node.js 及 Vue-cli 安装
查看>>
12.设计模式
查看>>
【JS基础】从JavaScript中的for...of说起(上) - iterator 和 generator
查看>>
自定义图片裁剪之双指缩放思路
查看>>
前端的伙伴们, chrome canary 控制台添加了一个非常实用的功能
查看>>
Serverless助力AI计算:阿里云ACK Serverless/ECI发布GPU容器实例
查看>>
export 和 export default的一些区别以及引入时解构的用法
查看>>
HTTP2基础教程-读书笔记(一)发展史和诞生背景
查看>>
移动端调试方法汇总
查看>>
未来人类会成为机器人吗?
查看>>
js原生日历
查看>>
Cookie简介
查看>>
sublime text3 中 CTags: Rebuild Tags执行之乱码解决方法
查看>>
js的几种sleep函数
查看>>
跨域问题及解决方案
查看>>
每日任务1
查看>>
全局注入SplashActivity界面框架。支持首次打开App开屏界面#再进程存活的情况下从后台进入前台注入开屏界面#再进程存活的情况下锁屏再亮屏进入开屏界面...
查看>>