利用MVC、Unity将Service实现Restful

现在移动设备端的需求越来越大,要满足其数据要求的一种方式就是实现Restful,脱离具体的后台支持方式。在微软的实现方式中,我们需要利用VS建立web API项目,利用 System.Web.Http就可以实现将自己的控制发布出来。

 public class OutValuesController : ApiController
    {
        // GET api/values
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }

        // GET api/values/5
        public string Get(int id)
        {
            return "value";
        }

        // POST api/values
        public void Post([FromBody]string value)
        {
        }

        // PUT api/values/5
        public void Put(int id, [FromBody]string value)
        {
        }

        // DELETE api/values/5
        public void Delete(int id)
        {
        }
    }

这种实现方式下需要继承ApiController,这个在很多已经有很多Service的系统中难以实现,另外对controller、Service有限制。

介绍两种利用MVC、Unity以及反射 实现的对Service的进行Restful。

第一种修改Microsoft.Web.Mvc实现;

首先利用一个Controller实现Restful,修改它的ActionInvoker来将调用拦截下来。

 public class ApiHelperController : Controller
    {
        //微软的ControllerActivator激活Controller时,执行的就是无参数的构造函数!
        public ApiHelperController()
        {
            base.ActionInvoker = new MyActionInvoker();
        }
    }

然后,下面比较乱了,总体就是从Controllercontext中获取Controller、method的名称,利用Unity根据Controller的名称来取得实例,利用反射直接调用invoke,将result 用Json来实现。

  public override bool InvokeAction(ControllerContext controllerContext, string controllerName)
        {
            //根据action名称去找Action并执行,其中包括了 View的呈现 以及 应用在Action上的各种特性的执行
            //return false; //执行失败
            // return true;    //执行成功
            //return base.InvokeAction(controllerContext, actionName);

            Type mappedType;
            mappedType = UnityConfig.GetConfiguredContainer().Registrations.SingleOrDefault(n => n.Name == controllerName).MappedToType;
          
            object service = UnityConfig.GetConfiguredContainer().Resolve(mappedType, new Microsoft.Practices.Unity.ResolverOverride[] { });

            //object service =UnityConfig.GetTargetService(controllerName);
            string methodName = controllerContext.RequestContext.RouteData.GetRequiredString("id");

            MethodInfo method = service.GetType().GetMethod(methodName);
            NameValueCollection c = controllerContext.RequestContext.HttpContext.Request.QueryString;
            string[] targetParams = new string[c.Count];
            c.CopyTo(targetParams, 0);

            //得到指定方法的参数列表   
            ParameterInfo[] paramsInfo = method.GetParameters();
            HttpResponseBase response = controllerContext.HttpContext.Response;
            JavaScriptSerializer serializer = new JavaScriptSerializer();

            if (paramsInfo.Length != c.Count)
            {
                response.Write("参数不匹配!");
                return true;
            }

            object[] finalParams = new object[c.Count];

            for (int i = 0; i < c.Count; i++)
            {
                Type tType = paramsInfo[i].ParameterType;
                //如果它是值类型,或者String   
                if (tType.Equals(typeof(string)) || (!tType.IsInterface && !tType.IsClass))
                {
                    //改变参数类型   
                    finalParams[i] = Convert.ChangeType(targetParams[i], tType);
                }
                else if (tType.IsClass)//如果是类,将它的json字符串转换成对象   
                {
                    finalParams[i] = Newtonsoft.Json.JsonConvert.DeserializeObject(targetParams[i], tType);
                }
            }

            object data = method.Invoke(service, finalParams);
            response.Write(serializer.Serialize(data));
            return true;
        }
时间: 2024-11-09 03:41:16

利用MVC、Unity将Service实现Restful的相关文章

IOC容器特性注入第六篇:利用MVC注入点,把容器启动

这里是利用MVC三个注入点中的:IDependencyResolver 进行注入 在全局类中Global.asax代码如下: #region MVC Inject System.Web.Mvc.DependencyResolver.SetResolver(new DaHua.Sites.DependencyResolve(DaHua.Common.Runtime.EngineContext.Current, System.Web.Mvc.DependencyResolver.Current));

利用MVC Chart 打造后台图表、前端图表

应用场景是这个样子的:要做导出数据到PDF的功能,涉及到文本.表格.图表等内容.在做图表功能时,发现之前用Highcharts做的图表根本就不能集成到PDF中.这里需要一个能在程序后台就生成图表的功能,通过两个步骤进行集成: 1)将图表生成到一个图片文件中,存储在服务器上: 2)根据指定的图片路径,将图片集成到PDF. 那么集成的核心就为:如何在.net程序后台就生成一个图表. 这里介绍的是: 1)如何利用 Mvc Chart在程序的后台生成图表: 2)如何利用 Mvc Chart在前端生成图表

Thinkphp -- 利用MVC模式完成注册登录功能

这是一篇记录向,记录我后台的学习过程. 如有不正确的地方,请多多指教. 基础知识: MVC即 Model View Controller Model(模型)表示应用程序核心(比如数据库记录列表). View(视图)显示数据(数据库记录). Controller(控制器)处理输入(写入数据库记录). (图源https://www.runoob.com/design-pattern/mvc-pattern.html) 当我们浏览一个网页的时候首先会访问到View(视图层) 在我们输入用户名密码之后,

利用Spring MVC搭建REST Service

之前写过一篇 利用JAX-RS快速开发RESTful 服务 今天来看下spring-mvc框架如何实现类似的功能: 一.pom.xml 1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-insta

Spring MVC中使用 Swagger2 构建Restful API

1.maven依赖 <!-- 构建Restful API --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.6.0</version> </dependency> <dependency> <groupId>io.spr

Web Service 与 RESTful Web Service比较

REST ful Web Service是什么? REST是一种架构风格,其核心是面向资源,REST专门针对网络应用设计和开发方式,以降低开发的复杂性,提高系统的可伸缩性.REST提出设计概念和准则为: 1.网络上的所有事物都可以被抽象为资源(resource) 2.每一个资源都有唯一的资源标识(resource identifier),对资源的操作不会改变这些标识 3.所有的操作都是无状态的 REST简化开发,其架构遵循CRUD原则,该原则告诉我们对于资源(包括网络资源)只需要四种行为:创建,

利用MVC编程模式-开发一个简易记事本app

学了极客学院一个开发记事本的课程,利用自己对MVC编程模式的简单理解重写了一遍该app. github地址:https://github.com/morningsky/MyNote MVC即,模型(model)-视图(view)-控制器(controller),有效的实现了数据-业务逻辑-视图显示的代码分离,使得加入新功能时不需要重新编写业务逻辑,大大提高了代码的可维护性. 在这个案列中,一开始只是开发了添加文字内容的记事功能,添加图片功能时在activity文件中写入imageview的逻辑

利用MVC的自定义过滤器FilterAttribute、IActionFilter、IExceptionFilter实现异常处理等功能

今天在博客园上看了一篇推荐文章,还说得蛮有道理: http://www.cnblogs.com/richieyang/p/4779028.html 项目中确实有各种后台验证过程,最常见的莫过于判空,而在捕获到了异常信息后如何处理,各个项目组有自己不同的要求.我的项目组要求是:所有业务模块的异常不允许处理,而是直接抛出. 这种统一的处理方式一方面可以简化业务模块的开发过程,即在业务模块中直接throw自定义的异常信息即可,另一方面也可以对异常进行统一的处理,如记录日志等. 上文中也提到在MVC中可

浅谈MVC中的service层(转)

概述 mvc框架由model,view,controller组成,执行流程一般是:在controller访问model获取数据,通过view渲染页面. mvc模式是web开发中的基础模式,采用的是分层设计,各层之间职责分明.然而事与愿违,当我们日积月累的基于mvc模式开发之后,会逐渐的感受到层与层之间存在粘连和职责模棱两可的地方,这就是service层出现的重要原因. 问题是什么? 问题的本质是:业务逻辑粘连了C层和M层,应该从C层&M层解耦出来,成为独立的Service层. 在C层直接实现业务