Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 利用MVC、Unity將Service實現Restful

利用MVC、Unity將Service實現Restful

編輯:關於Android編程

現在移動設備端的需求越來越大,要滿足其數據要求的一種方式就是實現Restful,脫離具體的後台支持方式。在微軟的實現方式中,我們需要利用VS建立web API項目,利用System.Web.Http就可以實現將自己的控制發布出來。
 public class OutValuesController : ApiController
    {
        // GET api/values
        public IEnumerable 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;
        }





  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved