<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      MVC 2.0+Entity Framework在使用依賴注入時遇到的問題

      前言:

      最近在看MVC 3.0 Beta Release Note的時候,發現了IDependencyResolver接口,又看到了兩篇關于MVC下使用依賴注入的文章(傳送門1傳送門2)。

      于是乎,對依賴注入進行了學習,并對以前做的一個網站進行了重構(使用Unity)。

      其實完全沒有必要,因為無法充分體現依賴注入的優勢,反而在性能上有點損失,就當練手一下吧~

       

      在這個過程中(網站是MVC2.0做的),發現MVC2.0和Entity Framework在依賴注入過程中出現了一些問題,所以在此,詳解一下。

       

      MVC 2.0下實現依賴注入:

      MVC2.0對依賴注入的支持度很小,理解依賴注入的原理后大家都知道,這里的關鍵就是需要找到一個切入點,分析對象之間的關系和生命周期后發現,從Controller切入是一個明智的選擇。

      那怎么攔截原本的Controller創建過程,替代成我們自己的創建過程呢?

       

      看了RoRoWoBlog的源碼和傳送門1這篇文章后,發現MVC中的Controller是由 DefaultControllerFactory 這個類創建的,很明顯,這是一個Controller工廠類,職責就是用來創建Controller對象的。

      反編譯之:

      image

       

      可以發現內部有大量的虛方法,而且從名字中可以看出,這是這個工廠的關鍵,繼承并重寫之即可。

      public class MyConrtollerFctory : DefaultControllerFactory
      {
          protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
          {
              if (requestContext == null || controllerType == null)
              {
                  throw new ArgumentNullException("controller");
              }
              return MvcApplication.Container.Resolve(controllerType) as IController;
          }
      }

       

      接下來利用一個靜態方法在Global.asax中替換默認的Controller工廠

      protected void Application_Start()
      {
          AreaRegistration.RegisterAllAreas();
      
          RegisterGlobalFilters(GlobalFilters.Filters);
          RegisterRoutes(RouteTable.Routes);
      
          //替換默認Controller工廠
          ControllerBuilder.Current.SetControllerFactory(new MyConrtollerFctory());
      }

       

      如何正常地拋出異常:

      一切看似是那么地順利,運行一下,成功了!

      但是,忽然發現問題了!

      image

       

      當初輸入一個不存在的Controller的時候,竟然報錯了!而不是返回404錯誤!

      高亮的那段話,顯示問題出在這,看上去是在替代這個方法的時候,沒有正確地拋出異常

       

      繼續反編譯,查看這個方法:

      protected internal virtual IController GetControllerInstance(RequestContext requestContext, Type controllerType)
      {
          if (controllerType == null)
          {
              throw new HttpException(0x194, string.Format(CultureInfo.CurrentCulture, MvcResources.DefaultControllerFactory_NoControllerFound, new object[] { requestContext.HttpContext.Request.Path }));
          }
          if (!typeof(IController).IsAssignableFrom(controllerType))
          {
              throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, MvcResources.DefaultControllerFactory_TypeDoesNotSubclassControllerBase, new object[] { controllerType }), "controllerType");
          }
          return this._activatorResolver.Current.Create(requestContext, controllerType);
      }

       

      看上去問題就出在這了,由于我們拋出了自定的異常,導致外層沒有Catch到,所以它認為這不是404錯誤

       

      既然知道了原因,那解決起來豈不是很簡單?直接把這段代碼拷貝過來就行了~

      但是問題又來了,這段代碼中有幾個對象是 internal(程序集可見)

      我們的代碼和它不在同一個程序集,那當然也不能訪問了… 怎么辦?繼續反編譯?把代碼復制過來?

       

      這個方案恐怕很不友好,其實,有一個小技巧,雖然看起來不怎么樣,但是它的確有效~

      public class MyConrtollerFctory : DefaultControllerFactory
      {
          protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
          {
              if (requestContext == null || controllerType == null)
              {
                  //關鍵
                  base.GetControllerInstance(requestContext, controllerType);
              }
              return MvcApplication.Container.Resolve(controllerType) as IController;
          }
      }

       

      將重寫Controller工廠類的時候,如果需要拋出異常,就直接訪問基類的方法,讓基類去拋吧~ 這樣就不用擔心什么了~

      image

       

      Entity Framework中遇到的問題:

      不僅是MVC2.0,EF對依賴注入的支持度也不高。

      主要體現在,ObjectContext 是由工具自動生成的,可以修改,但不建議修改它。

      ObjectContext 又是有多個構造函數的,要么寫配置文件,要么給它的構造函數上加上 InjectionConstructor 這個Attribute。

      前者太麻煩,我只是一個小項目,沒必要寫配置文件;后者要修改核心代碼,不符合上面的原則。

       

      其實還有一種很方便的辦法可以解決這個問題,只要在 UnityContainer  中注冊一下 ObjectContext 的構造函數即可。

      /// <summary>
      /// Unity容器
      /// </summary>
      static private UnityContainer container;
      static public UnityContainer Container
      {
          get
          {
              if (container == null)
              {
                  container = new UnityContainer();
                  //注冊構造函數
                  container.RegisterInstance<ModelContainer>(new ModelContainer());
              }
              return container;
          }
      }

       

      后記:

      據VC 3.0 Beta對依賴注入有了很好的支持(傳送門2),期待~ 希望在正式版中能確定一下用法,不要一直變了~

      posted @ 2010-10-16 14:18  Dozer  閱讀(2794)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产日韩精品视频无码| 丝袜欧美视频首页在线| 无码av免费毛片一区二区| 国产无遮挡吃胸膜奶免费看| 日韩有码中文字幕av| 老女老肥熟国产在线视频| 国产一区二区三区高清视频| 国产成人精品视频不卡| 1区2区3区高清视频| 天天综合色天天综合色h| 2020国产激情视频在线观看| 久青草国产在视频在线观看| 加勒比无码人妻东京热| 亚洲人成网站18禁止无码| 普宁市| 国产精品亚洲а∨天堂2021| 人人妻人人澡人人爽人人精品电影| 成人片黄网站色大片免费| 国产精品夫妇激情啪发布| 一个人看的www免费高清视频| 麻豆国产va免费精品高清在线 | 高清无码在线视频| 蜜桃臀av一区二区三区| 国产系列丝袜熟女精品视频 | 狠狠躁夜夜躁人人爽天天古典 | 精品国产成人一区二区| 国产电影无码午夜在线播放| 视频二区中文字幕在线| 国产成人精品无码播放| 免费观看全黄做爰大片| 免费看的一级毛片| 欧美性xxxxx极品| 一区二区三区激情免费视频| 国产av一区二区三区| 成人免费无码不卡毛片| 亚洲另类无码一区二区三区| 欧美一本大道香蕉综合视频| 国产黄色精品一区二区三区| 护士的小嫩嫩好紧好爽| 久久久久青草线蕉综合超碰| 暖暖 在线 日本 免费 中文|