国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

自己實現簡單的AOP(五)使Demo適應webApi、亦可完成屬性自動注入

2019-11-14 14:26:32
字體:
來源:轉載
供稿:網友

 

在前文的Demo中,webApi的Controller是不能自動注入的,原因是 IHttpController 和 IController 是通過兩個不同的途徑進行激活的。

IHttpController的激活是通過 IHttpControllerActivator 接口完成的

    // 摘要:    //     定義 System.Web.Http.Dispatcher.IHttpControllerActivator 所需的方法。    public interface IHttpControllerActivator    {        // 摘要:        //     創建一個 System.Web.Http.Controllers.IHttpController 對象。        //        // 參數:        //   request:        //     消息請求。        //        //   controllerDescriptor:        //     HTTP 控制器描述符。        //        //   controllerType:        //     控制器的類型。        //        // 返回結果:        //     System.Web.Http.Controllers.IHttpController 對象。        IHttpController Create(HttPRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType);    }

而其默認實現類為:DefaultHttpControllerActivator 

  // 摘要:    //     表示 System.Web.Http.Dispatcher.IHttpControllerActivator 的默認實現。可以通過 System.Web.Http.Services.DependencyResolver    //     注冊不同的實現。我們已針對每個 System.Web.Http.Controllers.HttpControllerDescriptor 實例具有一個    //     System.Web.Http.Controllers.ApiControllerActionInvoker 實例的情況進行優化,但也支持一個 System.Web.Http.Controllers.ApiControllerActionInvoker    //     具有多個 System.Web.Http.Controllers.HttpControllerDescriptor 實例的情況。對于后一種情況,查找會略慢一些,因為查找需要遍歷    //     HttpControllerDescriptor.Properties 目錄。    public class DefaultHttpControllerActivator : IHttpControllerActivator    {        // 摘要:        //     初始化 System.Web.Http.Dispatcher.DefaultHttpControllerActivator 類的新實例。        public DefaultHttpControllerActivator();        // 摘要:        //     使用給定 request 創建 controllerType 所指定的 System.Web.Http.Controllers.IHttpController。        //        // 參數:        //   request:        //     請求消息。        //        //   controllerDescriptor:        //     控制器描述符。        //        //   controllerType:        //     控制器的類型。        //        // 返回結果:        //     類型 controllerType 的實例。        public IHttpController Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType);    }

 

知道了上述信息,最簡單的辦法就是繼承并重寫 DefaultHttpControllerActivator ,但是不巧的是其 Create 不是虛函數,不能重寫。咋辦法呢?變通一下,動態改變對象的行為——裝飾模式。當然這里沒必要嚴格按照裝飾模式死板的去應用,完全沒必要的。只需要按照裝飾原理,將 DefaultHttpControllerActivator 進行裝飾,再將裝飾對象注冊到系統中即可。

比如:

        /// <summary>        /// 用于Web Api        /// </summary>        private class MyHttpControllerActivator : IHttpControllerActivator        {            private DefaultHttpControllerActivator defaultActivator;            public MyHttpControllerActivator()            {                this.defaultActivator = new DefaultHttpControllerActivator();            }            public IHttpController Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)            {                IHttpController httpController = this.defaultActivator.Create(request, controllerDescriptor, controllerType);                if (httpController != null)                {                    /// 自動裝配屬性                    /// <para>為屬性對象啟用代理,并延遲初始化被代理的對象</para>                    DelayProxyUtil.AutowiredProperties(httpController);                }                return httpController;            }        }

然后在 應用程序啟動的時候進行注冊:

// 使AOP適應 WebApi            GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerActivator), new MyHttpControllerActivator());

 

如此,WebApi中的Controller屬性,也會被自動注入了。

 

源碼地址:http://files.VEVb.com/files/08shiyan/AOPDemo.zip

 (暫完,后續補充中...)


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 平果县| 滨州市| 延津县| 闸北区| 广饶县| 专栏| 洛隆县| 乐山市| 东阳市| 呼图壁县| 和硕县| 石阡县| 万盛区| 娄烦县| 武山县| 大名县| 莫力| 长沙市| 当阳市| 张家川| 闽清县| 连江县| 巴林左旗| 任丘市| 定南县| 深水埗区| 上栗县| 柳州市| 棋牌| 茌平县| 蒲江县| 华容县| 金溪县| 淮安市| 琼结县| 洪泽县| 龙岩市| 正蓝旗| 兴宁市| 永靖县| 乌拉特中旗|