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

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

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

      自己動(dòng)手做Web框架—MVC+Front Controller

      在我前面一篇博文《逃脫Asp.Net MVC框架的枷鎖,使用Razor視圖引擎》發(fā)表之后,很多人關(guān)心,脫離了之后怎么辦?那么這可以說是它的續(xù)篇了。
      同時(shí),這也是eLiteWeb開源軟件的一部分。

      MVC + Front Controller

      我 們常常提到的MVC中作為Controller的C。其實(shí)有兩項(xiàng)任務(wù),一個(gè)是處理Http請(qǐng)求,另一個(gè)是對(duì)請(qǐng)求中的用戶數(shù)據(jù)進(jìn)行的處理。前者,有:安全認(rèn) 證,Url映射等。Front Controller 模式就是把這個(gè)C進(jìn)一步分離。兩個(gè)責(zé)任兩個(gè)類(單一責(zé)任原則)。因此,這里給我的MVC模式,賦予新的內(nèi)涵C => Command,以詮釋兩個(gè)模式的融合。

      非我族類,拒之門外 --- 轉(zhuǎn)換器BasicHttphandler

      這是一個(gè)Adapter目的就是為了把ASP.Net環(huán)境轉(zhuǎn)化為我自定義的Web抽象。

      首先就是BasicHttphandler本身實(shí)現(xiàn)了IHttpHandler,并在Web.config中設(shè)置為默認(rèn)的系統(tǒng)HttpHandler,把控制權(quán)拿了過來,我的世界我做主。

      其次,把HttpContext轉(zhuǎn)換為自定義的WebRequest,然后傳遞給Front Controller作進(jìn)一步的處理處理。

      public class BasicHttpHandler:IHttpHandler
          { public class BasicHttpHandler:IHttpHandler
          {
              private FrontController front_controller;
              private WebRequestAdapter web_request_adapter;
      
              public BasicHttpHandler(WebRequestAdapter webRequestAdapter, FrontController frontController)
              {
                  web_request_adapter = webRequestAdapter;
                  front_controller = frontController;
              }
              public BasicHttpHandler()
                  : this(Container.get_a<WebRequestAdapter>(),Container.get_a<FrontController>()) {}
      
              public void ProcessRequest(HttpContext context)
              {
                  front_controller.process(web_request_adapter.create_from(context));
              }
      
              public bool IsReusable
              {
                  get {return true; }
              }
          }

      總閥門 --- Front Controller

      它的實(shí)現(xiàn)也很簡(jiǎn)單,就是通過命令解析器CommandResolver,找到可執(zhí)行的命令,傳入WebRequest進(jìn)行處理。

      [RegisterInContainer(LifeCycle.single_call)]
          public class FrontControllerImpl : FrontControllers.FrontController
          {
              private CommandResolver command_resolver;
      
              public FrontControllerImpl(CommandResolver commandResolver)
              {
                  command_resolver = commandResolver;
              }
      
              public void process(WebRequest request)
              {
                  command_resolver.get_command_to_process(request).process(request);
              }
          }

      從流程上,到這里整個(gè)處理已經(jīng)完成;剩下的可以看作是你自己功能的擴(kuò)展。

      以下可以看作是我的一個(gè)具體簡(jiǎn)單實(shí)現(xiàn)。

      Command系列接口

      前 面提到的命令解析器我就是簡(jiǎn)單用到一個(gè)Command集合(IEnumerable<Command>),而尋找執(zhí)行命令這一邏輯,是通過 Command自身的方法can_process(WebRequest)的調(diào)用,從而巧妙的把責(zé)任分布到每個(gè)具體Command自身去了。這就是集中規(guī)則,分散責(zé)任。其實(shí),依賴注入的實(shí)現(xiàn)中,聲明式注入(RegisterInContainerAttribute)也是類似的場(chǎng)景。

       

      [RegisterInContainer(LifeCycle.single_call)]
          public class CommandResolverImpl : CommandResolver
          {
              private IEnumerable<Command> available_commands;
      
              public CommandResolverImpl(IEnumerable<Command> availableCommands)
              {
                  available_commands = availableCommands;
              }
      
              public Command get_command_to_process(WebRequest request)
              {
                  return available_commands.First(x => x.can_process(request));
              }
          }


      仔細(xì)看看Command,這一接口又分解為兩個(gè)粒度更小的接口:DiscreteCommand和過濾器Command。

      public  interface Command : DiscreteCommand, CommandFilter
          {
          }
      
       public interface DiscreteCommand
          {
              void process(WebRequest request);
          }
      
       public interface CommandFilter
          {
              bool can_process(WebRequest request);
          }


      從它們各自帶的方法可以清晰的看到它們的角色分工,前者是具體處理用戶數(shù)據(jù),之后的所有具體命令處理類,如Index, Home都要實(shí)現(xiàn)這個(gè)接口,一個(gè)方法,從而其間簡(jiǎn)潔與單純性已是做到了極致;后者就是命令過濾,承擔(dān)選擇可執(zhí)行命令的責(zé)任,Url的路由映射就實(shí)現(xiàn)這個(gè)接 口,我這里只簡(jiǎn)單實(shí)現(xiàn)了用正則映射(過濾)器 RegularExpressFilter。

      public class RegularExpressFilter:CommandFilter
          {
              private readonly Regex regex;
      
              public RegularExpressFilter(string match)
              {
                  regex = new Regex(match);
              }
      
              public bool can_process(WebRequest request)
              {
                  return regex.IsMatch(request.Input.RequestPath);
              }
          }

      View

      視圖的這一部分,就到跳到每一個(gè)具體的命令類中了,如 Index類中,通過調(diào)用WebRequest.Output.Display(View, Model),后臺(tái)把調(diào)用傳遞到ViewEngin的一個(gè)實(shí)現(xiàn)類。需要知道更詳細(xì),可以到參考前文《代碼整潔之道------Razor Compiler的重構(gòu)

      便用示例

      當(dāng)要為你的Web程序創(chuàng)建一個(gè)頁面時(shí),只有三步:

      第一步:創(chuàng)建一個(gè)類實(shí)現(xiàn)DiscreteCommand接口,并注冊(cè)到Container中。在process(WebRequest)完成你需要的功能,我這只是顯示一些文本,作為演示。

      [RegisterInContainer(LifeCycle.singleton)]
          public class Index:DiscreteCommand
          {
              public void process(WebRequest request)
              {
      
                  request.Output.Display(new View("Index"),
                      @" <h3>卓越之行</h3>
      <p>宏卓科技公司專注于最新軟件開發(fā)技術(shù)、開發(fā)流程和業(yè)務(wù)服務(wù)。讓所有這些技術(shù)為了一個(gè)目標(biāo)---您的業(yè)務(wù)服務(wù). </p>
      <ul>
          <li> 使用行為/測(cè)試驅(qū)動(dòng)方式追溯需求,驅(qū)動(dòng)開發(fā),不丟需求 </li>
          <li> 利用敏捷流程提高用戶體驗(yàn),降低風(fēng)險(xiǎn) </li>
          <li> 使用良好的架構(gòu)提高系統(tǒng)的擴(kuò)展性和維護(hù)性,同時(shí)降低開發(fā)的可變成本 </li>
          <li> 利用對(duì)業(yè)務(wù)流程的深入了解,開發(fā)適用軟件,提供業(yè)務(wù)服務(wù),使服務(wù)與軟件無縫結(jié)合、同步發(fā)展。</li>
      <ul>
      <p>
      終極目標(biāo):動(dòng)成長軟件,讓我們的系統(tǒng)與你公司的業(yè)務(wù)一起成長。
      </p>
      "
                      );
              }


      第二步:在映射注冊(cè)類RoutesRegistration中,填加一條映射記錄.。因?yàn)槲也灰呀?jīng)用命令工廠類封裝了正則過濾器,所以代碼看起來簡(jiǎn)單而易讀一些。

      public class RoutesRegistration:StartupCommand
          {
              private Registration registration;
      
              public RoutesRegistration(Registration registration)
              {
                  this.registration = registration;
              }
      
              public void run()
              {
                  var routes = Container.Current.get_a<RoutingTable>();
                  var factory = new CommandFactory();
                  routes.add(factory.match<Home>("Home.do"));
                  routes.add(factory.match<Index>("Index.do"));
              }
          }

       


      第三步:創(chuàng)建Razor頁面

      @inherits Skight.eLiteWeb.Presentation.Web.ViewEngins.TemplateBase<string>
      @{
          Layout = "_Layout.cshtml";
      }
      <html xmlns="http://www.w3.org/1999/xhtml">
      <head runat="server">
      
        <title>Index 頁面</title>
      </head>
      
        <body>
          <h2>宏卓科技 與你公司的業(yè)務(wù)一起成長!</h2> 
      
       <img src="/Theme/Index_pepole.jpg" style="float: left; margin-right: 50px;" />
      
          @Model
      
      </body>
      
      </html>

      總結(jié):是的,這里的具體功能很簡(jiǎn)單,但是,相信你也看到了其強(qiáng)大的擴(kuò)展性,如Url映射的擴(kuò)展和Command擴(kuò)展。與Asp.Net不同,我這里一個(gè)Web請(qǐng)求是用一個(gè)類來處,而不是一個(gè)方法,這樣,繼承、重用和擴(kuò)展都很方便。

      最后一個(gè)優(yōu)勢(shì):所有的處理類都是自定義的輕型類,繼承層次較少,對(duì)外部的依賴為0,這個(gè)于性能是大有裨益的。

      這也是把輕型作為框架名稱的含義:對(duì)外依賴的輕型,性能上的

      (本文版權(quán)屬于? 2012 - 2013 予沁安 | 轉(zhuǎn)載請(qǐng)注明作者和出處WangHaoBlog.com

      最后,一全景類圖和序列圖做結(jié)。

      1

      2

      3

      posted @ 2013-08-01 07:19  予沁安  閱讀(3258)  評(píng)論(4)    收藏  舉報(bào)
      主站蜘蛛池模板: 无码精品国产VA在线观看DVD | 亚洲一区二区三区自拍麻豆| 亚洲成人av日韩在线| 国产一区二区不卡在线| 亚洲美女被黑人巨大在线播放| 一区二区三区激情免费视频| 少妇内射高潮福利炮| 雷波县| 思思久99久女女精品| 欧美激情一区二区久久久| 久久97人人超人人超碰超国产| 免费看国产曰批40分钟| 中文字幕亚洲综合久久| 网友自拍视频一区二区三区| 亚洲三区在线观看内射后入| 四虎永久精品在线视频| 国产午夜福利视频一区二区| 自拍偷拍另类三级三色四色| 六十路老熟妇乱子伦视频| 欧洲中文字幕一区二区| brazzers欧美巨大| 日本一区二区三区专线| 亚洲中文字幕无码专区| 极品无码国模国产在线观看| 高潮精品熟妇一区二区三区 | 最新午夜男女福利片视频| 日韩人妻无码精品久久| 久久人人爽人人爽人人片| 毛片av在线尤物一区二区| 2020国产成人精品视频| 粉嫩少妇内射浓精videos| 国产精品中文字幕视频| 国产亚洲精品自在久久vr| 日韩在线视频线观看一区| 东莞市| 国产农村乱人伦精品视频| 精品一区二区中文字幕| 巨胸喷奶水视频www免费网站 | 富平县| 粉嫩一区二区三区国产精品| 亚洲国产在一区二区三区|