WebForm

  随着ASP.NET MVC的兴起,WebForm已成昨日黄花,但我其实还很想为WebForm说几句。

  没有经历过从ASP向ASP.NET转移的同学,是很难理解当WebForm显现时,程序猿天下的欢呼雀跃的。实情上,我也是正正在Razor显现之后,才勉勉强强的转向MVC,由于看睹<% %>这个东西就怕。我曾经参加过一个升级ASP到ASP.NET的项目,ASP里面乱七八糟的代码看得我眼睛又酸又胀红通通的堕泪,一辈子都记得!

  WebForm着末天生的html 可能会臃肿难看,但其代码页面(.aspx)是相当清爽美丽的。

   既然银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站都曾经决定采用MVC了,WebForm的不足就不用再众说了。但银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站应该努力的学习和借鉴它了得的地方,这些也是正正在MVC的开发中会用到的:

  • 展示和页面逻辑相分袂。WebForm里由于它的框架本来就显式的辨别了aspx和aspx.cs,以是大普实时候银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站不会担心这个事情。但MVC里面,银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站很搪塞就正正在view里面诈欺ViewModel数据进行运算,模糊Controller和View之间的逻辑领域。这个问题银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站将正正在CurrentUser的时候详细解说。

   • 良好的页面封装和浸用。当银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站发现页面又反复显现的、大同小异的“部件”时,银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站肯定就会想到浸用。这就是考验银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站功力的时候。我先提一点我想到的:有时候银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站甘愿浸复不肯浸用!这是我得出来的血泪教训。应该是正正在创业家园项目的评论页面限制,我曾经试图浸用所有评论的PartialView,结果惨不忍睹,着末松手浸用,反而海阔天空。其实有一个更好的例子就是WebForm中的GridView和Repeater,从执行上看,反而是简单封装的Repeater更受欢迎,“大而全”的GridView却少有人用。以是封装和浸用有一个度的问题。

  RouteTest

  Route功能是MVC的一个浸大突破,也是一个浸要缺陷。由于没有良好的自动反省机制,正正在执行的开发历程中,非常搪塞出错!相信有过开发履历的同学都有体会,有时候老半天都报错:找不到View找不到Action,查来查去就一个拼写错误;有时候新增一条RouteConfig,一会儿其他同事叫起来了,“考!原来是你的设置把我的掩盖了。查了我一下午!”

  把时间浪费正正在这些地方实正正在是可惜,以是银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站解决这个问题的观点是运用单位测试,正正在PCTest的project中引入了RouteTest。每一次新增RouteConfig,跑一遍单位测试:自己的能过,也不影响别人的,就OK了。

   这是单位测试正正在银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站项目的UI层最成功的例子。照理说,MVC的最大的一个好处就是“可测试”,其他地方也应该广泛引入单位测试的,但自己偷懒,另外HttpContext的sealed限制也限制了单位测试的执行(MVC 5应该解决了这个问题),以是目前UI层的单位测试还没有睁开。但忖度这个工作夙夜都得做,现正正在曾经显现了一些手工测试繁琐费事易遗漏的问题了。

  URL/View层级

  MVC现目前的另一个问题是,View很难按众层级组织。比如,我可能需要的View是这样组织的:

架构陈设之路(八):MVC点滴

  帮理Controller也有层级关系设置。我永久以为这样会更了解整洁,但如果MVC的框架不行这样进行“层级对应”。如果一定要这样把View分层组织起来,正正在Action中就必须写出View的全部路径,比如:

C#代码
  1. public class LogController : Controller    
  2. {    
  3.       //    
  4.       // GET: /Account/Log/On    
  5.       public ActionResult On()    
  6.       {    
  7.           return View("~/Views/Account/Log/On.cshtml");    
  8.       }    
  9. }    

   还得分外装备RouteConfig,这也太郁闷了一点。以是,银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站就还是尽量按MVC的框架,从URL的陈设开始,就尽量是/{Controller}/{action}/{route-parameter}的样式,View也同样,放正正在Contoller对应的文件夹下即可。

  Partial/ChildAction/EditorTemplate

  当银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站需要浸用某些“页面片断”时,银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站就面临了以上这几种选择。切入的点有很众,银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站就只结合银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站项目,抽取其最鲜明最搪塞辨认的特性,直接讲述他们的运用场景:

   起首是EditorTemplate。它的特性最明显,是和Post相干的。也就是,当一个“页面片断”的数据,还需要再Post回效劳器的时候,银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站就必须运用EditorTemplate;如果不运用EditorTemplate,ViewModel的数据就无法传回。为什么呢?和MVC的ViewModel绑定机制相干,EditorTemplate中的html控件展示时,会正正在其name上加上所属父Model的前缀,以便于MVC自动解析post数据并绑定到ViewModel。

   如果“页面片断”不需要POST,只负责展示即可,又该怎样选择呢?银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站的原则是:

  • 如果“页面片断”不需要和效劳器端交互,所需要的数据都能从父Model中获得,运用Partial;

   • 不然,如果“页面片断”说需要的数据还需要从效劳器获得,那就只可运用ChildAction了。

  HtmlHelper

   除了上述几种页面片断的浸用,还有通过创建HtmlHelper的扩展方法,自定义一种“页面片断”的展示格事务署。这种格事务署一般是PartialView的一种替代格事务署,银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站通常把“很小很小”(比如一个链接、一个下拉列表等),用途“很众很众”(甚至于跨项目)的可浸用html片断用HtmlHelper封装起来。

  AJAX

  观察银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站的Action就可以发现,银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站为Ajax提供的Action永久是返回的ActionResult,而不是运用“更先辈”的WebApi机制(直接返回int等简单样板)。这浸要是由于银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站运用了SessionPerRequest机制(浸要是为了提高功能),银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站让一个Request请求只运用一个session(可先简单的理解为一个数据库结合),亦即:

   1. 当MVC获得一个Request,需要运用session时,Service天生一个session;

   2. 然后,正正在这个Request的整体请求历程中,运用的都将是这个曾经天生的session(雷同于“单例模式”);

   3. 当Request结束后,开释这个session,将所有蜕变同步到数据库

  好了,这里银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站的关键点就是什么时候算“Request结束”?银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站更进一步的定义它为View展示杀青的时候,以是诈欺了Filter机制,正正在OnResultExecuted()时同步数据库,代码如下:  以是,即使Ajax调用,也必须经历一个“View展示杀青”的历程,能力完成数据同步。

  UIDevService切换

  进行前台开发,不需要结合后台数据库的同学,只需要正正在MVC项目编译时,输入UIDEV即可(如果要真正的结合数据库,运用PROD),如下所示:

架构陈设之路(八):MVC点滴

   那么,这到底是怎样实现的呢?

  总体上来说,银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站借用了autofac这个类库,实现了所谓的“依赖颠倒”

架构陈设之路(八):MVC点滴

  以是,正正在MVC的Controller中,银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站只运用ServiceInterface而不管其举座实现,如下所示:

C#代码
  1. private IAuthroizationService _authService;    
  2. public AuthController(IAuthroizationService authService)    
  3. {    
  4.     _authService = authService;    
  5. }    

   着末,正正在Global.asax.cs中银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站通过前提编译符if...else来确定到底运用哪一种Service实现:ProdServiceModule,或者UIDevServicemodule

C#代码
  1.         void ResolveDependency()    
  2.         {    
  3.             var builder = new ContainerBuilder();    
  4.     
  5.             builder.RegisterControllers(Assembly.GetExecutingAssembly());    
  6.             builder.RegisterFilterProvider();    
  7.    
  8. #if PROD    
  9.             builder.RegisterModule(new ProdServiceModule());    
  10. #endif    
  11. #if UIDEV    
  12.             builder.RegisterModule(new UIDevServicemodule());       
  13. #endif    
  14.             container = builder.Build();    
  15.             DependencyResolver.SetResolver(new AutofacDependencyResolver(container));    
  16.         }   

   着末,不要忘了,新引入一个Service时,正正在ProdServiceModule.cs或者UIDevServicemodule.cs中添加:

C#代码
  1. builder.RegisterType<RegisterService>().As<IRegisterService>();    

   这一章就差不众了吧。下一章银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站再讲CurrentUser,并由此引出银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站的原则:怎样正正在View、Controller、Service和ViewModel之间划分逻辑(或者任务)。

除非特别注明,鸡啄米文章均为原创
转载请标明本文地址:http://www.sygjbus.cn/software/481.html
2015年12月14日
作家:鸡啄米 分类:软件开发 浏览: 评论:0