ASP.NET MVC Framework是微软在ASP.NET中所添加的一组类库,这组类库可以使用Model-View-Controller设计模式来开发ASP.NET的应用程序。它与现有的ASP.NET应用程序并没有冲突,所以两者是可以并发的。ASP.NET MVC Framework被包装在System.Web.Mvc.dll中,并利用ASP.NET Routing来支持动作流以及URL Rewriting的能力,让它可以更贴近Web的发展以及Web 2.0的特性。

ASP.NET MVC Framework的第一个版本于2009年3月17日发布RTM版本,最新的ASP.NET MVC 4.0则是于2012年8月15日正式发布。

ASP.NET MVC Framework对于多数有ASP开发经验的开发人员来说看起来比较不陌生,但对于没有接触过像ASP、PHPJSPPerl这些Web开发工具的开发人员来说,相对的不容易入门。

原理[编辑]

ASP.NET MVC是遵循软件模式的Model-View-Controller来发展,其中Model指的是数据或是业务逻辑组件,View是呈现给用户看的信息,而Controller则是接取来自用户的指令与数据,并将Model与View做集成的控制器,当服务器接到对ASP.NET MVC应用程序的要求时,服务器(IIS)会先使用UrlRoutingModule(ASP.NET Routing的HTTP 模块),由它来解析是否有包含ASP.NET MVC应用程序的URL,若有,则会产生一个MvcRouteHandler对象,这个对象会装载运行的必要信息,并且会调用包含在URL中的Controller的Execute方法来运行工作[1]

Controller对象是基于IController接口的规则所定义,提供针对HTTP要求做回应的一个运行工具,在ASP.NET MVC中已实现一个默认的类 Controller,提供了必要的基础功能,另外也发展了一个 Controller 工厂,称为 Controller Factory,以IControllerFactory接口定义,亦提供了DefaultControllerFactory,开发人员可以利用基本的类以及利用它们来派生自己的 Controller 或 Controller Factory 来实现自己的控制器逻辑功能。

Model对象则是为ASP.NET MVC提供数据,不过它没有基类,而是使用.NET Framework一般性的数据结构或是现在的ADO.NET数据对象,像是List、Dictionary、DataTable、DataReader与DataSet等等,当然也可以是自己开发的商业对象,这些数据会通过ASP.NET MVC的ModelBinder工具类来与Controller集成,ModelBinder本身是支持泛型(Generic)的,因为各种类型的数据它都可以使用。在ASP.NET MVC中提供了一个DefaultModelBinder对象,可支持大多数的.NET Framework数据类型,以及数组和已实现像是IList、IDictionary以及ICollection等接口的对象[2]

Model会在Controller运行动作时,作为一个ActionResult对象方式传回给MvcHandler对象,而这个对象即会指定要显示的View对象,像是下列代码所示:

  1. //
  2. // GET: /Person/
  3. public ActionResult Index()
  4. {
  5. return View(people);
  6. }
  7.  
  8. //
  9. // GET: /Person/Details/5
  10. public ActionResult Details(Person person)
  11. {
  12. return View(person);
  13. }
  14.  
  15. //
  16. // GET: /Person/Create
  17. public ActionResult Create()
  18. {
  19. return View();
  20. }
  21.  
  22. //
  23. // POST: /Person/Create
  24. [AcceptVerbs(HttpVerbs.Post)]
  25. public ActionResult Create(Person person)
  26. {
  27. if (!ModelState.IsValid)
  28. {
  29. return View("Create", person);
  30. }
  31.  
  32. people.Add(person);
  33.  
  34. return RedirectToAction("Index");
  35. }

View对象以IViewIViewDataContainer等接口为主,并且以ASP.NET的各式前端接口为主要输出工具,基于MVC的View弹性化设计考量,以往在ASP.NET Web Form的代码与HTML分离模式将不再存在,而是将代码与HTML混合的方式设计,让开发人员可以更精确的对View进行控制,而目前 ASP.NET MVC 支持的 View 有下列几种[3]

  • .aspx网页,由ViewPage来支持。
  • .ascx用户控件,由ViewUserControl来支持。
  • .master主版页面,由ViewMasterPage来支持。

每个 View 对象都会内含一个泛型的参数,用来装载要呈现的数据(即Model),然后使用类似下面的方式来呈现数据:

  1. <%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %>
  2.  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  4. <html >
  5. <head runat="server">
  6. <title><asp:ContentPlaceHolder ID="TitleContent" runat="server" /></title>
  7. <link href="../../Content/Site.css" rel="stylesheet" type="text/css" />
  8. </head>
  9.  
  10. <body>
  11. <div class="page">
  12.  
  13. <div id="header">
  14. <div id="title">
  15. <h1>My MVC Application</h1>
  16. </div>
  17.  
  18. <div id="logindisplay">
  19. <% Html.RenderPartial("LogOnUserControl"); %>
  20. </div>
  21.  
  22. <div id="menucontainer">
  23.  
  24. <ul id="menu">
  25. <li><%= Html.ActionLink("Home", "Index", "Home")%></li>
  26. <li><%= Html.ActionLink("About", "About", "Home")%></li>
  27. </ul>
  28.  
  29. </div>
  30. </div>
  31.  
  32. <div id="main">
  33. <asp:ContentPlaceHolder ID="MainContent" runat="server" />
  34.  
  35. <div id="footer">
  36. </div>
  37. </div>
  38. </div>
  39. </body>
  40. </html>

技术[编辑]

在ASP.NET MVC架构中,除了Controller、Model与View三个主要部分以外,还包含了许多技术以让这三层得以集成并交互运作。

Controller[编辑]

Controller在ASP.NET MVC应用程序中是负责中控的角色,也是来自客户端HTTP要求的处理核心,因此有许多处理与转向HTTP要求的辅助技术在Controller层次都会使用到。

ASP.NET 路由技术[编辑]

主条目:ASP.NET Routing

用来过滤客户端要求的URL,并借由定义好的路由表(route table)将要求导向至正确的MVC Controller,并调用Controller中的Execute方法运行,而Execute方法会将HTTP动作以及实际运行的指令交给正确的函数来运行。而通常一个MVC应用程序的URL都会是类似这样的URL格式:

  1. http://127.0.0.1/ControllerName/ActionName/ActionParameters

而MvcRouteHandler会拆解URL,找出目标的Controller,并且将ActionName以及ActionParameters传给Controller中负责的函数(以ActionName来指定)。例如下列的URL会传递给BlogController的GetList方法:

  1. http://127.0.0.1/Blog/GetList

动作与方法直接集成[编辑]

ASP.NET MVC利用了中介数据的技术,直接将方法对应到指定的 HTTP 动词 (GET/POST/PUT/DELETE/HEAD等),MvcHandler会判断要求的类,并将它交给URL中指定的方法来处理。目前MVC Framework可用下列的方式指定(均包含在 HttpVerbs 枚举类型中):

  • HttpVerbs.Get
  • HttpVerbs.Post
  • HttpVerbs.Delete
  • HttpVerbs.Put
  • HttpVerbs.Head

将数据模型与展示层直接包装[编辑]

ViewPageViewMasterPageViewUserControl等展示对象都支持泛型对象,可以直接装载Model数据传递至前端输出,可简化处理Model与View之间集成的动作,只要一个参数就可以将数据传给View:

  1. public ActionResult GetList()
  2. {
  3. return View(BlogDataModel);
  4. }

Model[编辑]

在 ASP.NET MVC 中,Model 相对不设限,可以使用内置的数据结构以及自定义的数据类,也可以是一个商业对象,因此 Model 的弹性相当大,除了前述的数据结构外,微软新发展的一些数据访问方式也可以应用在 Model 中,像是ADO.NET Entity FrameworkLINQ to SQL等技术。

另外,MVC在服务端数据验证中,提供了ViewDataDictionary类,这个类中有一个ModelState属性,内含了ModelStateDictionary类,开发人员可以利用这个类来控制数据验证的结果,而View中输出验证消息的部分会和此类有关系,例如下列的程序:

  1. [AcceptVerbs(HttpVerbs.Post)]
  2. public ActionResult Create(Person person)
  3. {
  4. if (person.Name.Trim().Length == 0)
  5. {
  6. ModelState.AddModelError("Name", "Name is required.");
  7. }
  8. if (person.Age < 1 || person.Age > 200)
  9. {
  10. ModelState.AddModelError("Age", "Age must be within range 1 to 200.");
  11. }
  12. if ((person.Zipcode.Trim().Length > 0) && (!Regex.IsMatch(person.Zipcode, @"^\d{5}$|^\d{5}-\d{4}$")))
  13. {
  14. ModelState.AddModelError("Zipcode", "Zipcode is invalid.");
  15. }
  16. if (!Regex.IsMatch(person.Phone, @"((\(\d{3}\) ?)|(\d{3}-))?\d{3}-\d{4}"))
  17. {
  18. ModelState.AddModelError("Phone", "Phone number is invalid.");
  19. }
  20. if (!Regex.IsMatch(person.Email, @"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$"))
  21. {
  22. ModelState.AddModelError("Email", "Email format is invalid.");
  23. }
  24. if (!ModelState.IsValid)
  25. {
  26. return View("Create", person);
  27. }
  28.  
  29. people.Add(person);
  30.  
  31. return RedirectToAction("Index");
  32. }

在 ASP.NET MVC 2.0 中,新增了一个可以直接让 MVC Framework 针对数据字段进行验证控制的模型,称为 Model Validation,它融合了在 .NET Framework 3.5 SP1 发表的 ASP.NET Dynamic Data Framework 中 Data Annotations (数据记号) 的特性,让开发人员可以只利用标记的方式来运行验证,或是利用自定义的代码来扩充数据记号的验证行为。

  1. using System.ComponentModel.DataAnnotations;
  2. namespace MvcDA {
  3. [MetadataType(typeof(ProductMD))]
  4. public partial class Product {
  5. public class ProductMD {
  6. [StringLength(50),Required]
  7. public object Name { get; set; }
  8. [StringLength(15)]
  9. public object Color { get; set; }
  10. [Range(0, 9999)]
  11. public object Weight { get; set; }
  12. // public object NoSuchProperty { get; set; }
  13. }
  14. }
  15. }

View[编辑]

由于View是直接呈现给用户,因此与用户交互的部分都要由此层处理,包含数据的输出以及以客户端操作为主的回应(例如脚本)等。

HTML 工具类[编辑]

HTML工具类在View中是很重要的输出工具,它内置了辅助产生HTML标签的工具方法,多数的HTML语法都可以利用它来产生,包含像链接(<a>)、窗体(<form>)以及窗体控件等等。HTML工具是以HtmlHelper类为核心,并配合System.Web.Mvc.Html名字空间的方法,以延伸方法(Extension Method)的方式,让产生HTML的程序就有如调用方法般简单[4]

  1. <h2>Index</h2>
  2.  
  3. <table>
  4. <tr>
  5. <th></th>
  6. <th>
  7. Id
  8. </th>
  9. <th>
  10. Name
  11. </th>
  12. </tr>
  13.  
  14. <% foreach (var person in Model) { %>
  15.  
  16. <tr>
  17. <td>
  18. <%= Html.ActionLink("Details", "Details", person )%>
  19. </td>
  20. <td>
  21. <%= Html.Encode(person.Id) %>
  22. </td>
  23. <td>
  24. <%= Html.Encode(person.Name) %>
  25. </td>
  26. </tr>
  27.  
  28. <% } %>
  29.  
  30. </table>
  31.  
  32. <p>
  33. <%= Html.ActionLink("Create New", "Create") %>
  34. </p>

数据验证[编辑]

View的HTML工具可以配合Model处理数据验证的结果,在ASP.NET中常用的ValidationSummary在这里也支持,而且MVC的架构让验证信息的输出也更加弹性[5]

  1. <h2>Create</h2>
  2.  
  3. <%= Html.ValidationSummary("Create was unsuccessful. Please correct the errors and try again.") %>
  4.  
  5. <% using (Html.BeginForm()) {%>
  6.  
  7. <fieldset>
  8. <legend>Fields</legend>
  9. <p>
  10. <label for="Name">Name:</label>
  11. <%= Html.TextBox("Name") %> Required
  12. <%= Html.ValidationMessage("Name", "*") %>
  13. </p>
  14. <p>
  15. <label for="Age">Age:</label>
  16. <%= Html.TextBox("Age") %> Required
  17. <%= Html.ValidationMessage("Age", "*") %>
  18. </p>
  19. <p>
  20. <label for="Street">Street:</label>
  21. <%= Html.TextBox("Street") %>
  22. <%= Html.ValidationMessage("Street", "*") %>
  23. </p>
  24. <p>
  25. <label for="City">City:</label>
  26. <%= Html.TextBox("City") %>
  27. <%= Html.ValidationMessage("City", "*") %>
  28. </p>
  29. <p>
  30. <label for="State">State:</label>
  31. <%= Html.TextBox("State") %>
  32. <%= Html.ValidationMessage("State", "*") %>
  33. </p>
  34. <p>
  35. <label for="Zipcode">Zipcode:</label>
  36. <%= Html.TextBox("Zipcode") %>
  37. <%= Html.ValidationMessage("Zipcode", "*") %>
  38. </p>
  39. <p>
  40. <label for="Phone">Phone:</label>
  41. <%= Html.TextBox("Phone") %> Required
  42. <%= Html.ValidationMessage("Phone", "*") %>
  43. </p>
  44. <p>
  45. <label for="Email">Email:</label>
  46. <%= Html.TextBox("Email") %> Required
  47. <%= Html.ValidationMessage("Email", "*") %>
  48. </p>
  49. <p>
  50. <input type="submit" value="Create" />
  51. </p>
  52. </fieldset>
  53.  
  54. <% } %>
  55.  
  56. <div>
  57. <%=Html.ActionLink("Back to List", "Index") %>
  58. </div>

不同类型的输出[编辑]

每一个Controller中负责回应的方法,都会回传一个ActionResult对象的信息,ActionResult是一个运行结果对象的封装体,当MvcHandler运行完指令接到ActionResult时,就会依照它的内容来输出数据。目前MVC Framework支持的ActionResult有下列几种:

  • ViewResult对象,这个对象内装载了IView接口的信息,以及IViewEngine的信息,实际产生输出数据的会是 IViewEngine,以及其指示的 View 对象。
  • PartialViewResult对象,与ViewResult相似,但它回传的是"部分展示",即用户控件的View。
  • ContentResult对象,装载由用户自定义的 Content-Type 以及数据。
  • EmptyResult对象,表示不回传任何东西。
  • HttpUnauthorizedReuslt对象,表示动作没有被授权(即 HTTP 401)的错误消息。
  • JavaScriptResult对象,表示回传的是JavaScript脚本。
  • JsonResult对象,表示回传的是JSON数据。
  • FileResult对象,表示回传的是一个文件数据。
  • RedirectResult对象,表示回传的是一个重导向 (HTTP Redirect) 指令。
  • RedirectToRouteResult对象,与 RedirectResult 类似,但是它是重导向给一个 Route 的路径。

通过多类型的ActionResult,开发人员可以自由决定要回传的数据的类型与格式。

应用[编辑]

目前微软有一个Oxite项目,是使用ASP.NET MVC Framework所开发的博客引擎,而这个项目已经被微软的部分应用平台所采用,像是MIX Online、PDC 2009、MIX Video等官方网站都采用它来开发[6]。另外,stackoverflow.com以及codeplex.com这两个网站也是采用ASP.NET MVC Framework。

版本历程[编辑]

Release History
Date Version Notes
2007-12-10 ASP.NET MVC Framework 以CTP方式发布
2008-03-05 ASP.NET MVC Preview 2 已发布
2008-05-01 ASP.NET MVC Preview 3 已发布
2008-07-16 ASP.NET MVC Preview 4 已发布[7]
2008-08-28 ASP.NET MVC Preview 5 已发布[8]
2008-10-16 ASP.NET MVC Beta 已发布[9]
2009-01-27 ASP.NET MVC RC 已发布[10]
2009-03-03 ASP.NET MVC RC 2 已发布[11]
2009-03-17 ASP.NET MVC 1.0 已发布[12]
2009-07-31 ASP.NET MVC 2.0 Preview 1 已发布[13]
2009-11-17 ASP.NET MVC 2.0 Beta 已发布[14]
2010-03-11 ASP.NET MVC 2.0 RTM 已发布[15]
2010-10-06 ASP.NET MVC 3.0 Beta 持续更新中[16]
2010-11-08 ASP.NET MVC 3.0 RC 已发布[17]
2011-01-13 ASP.NET MVC 3.0 RTM 已发布[18]
2011-09-20 ASP.NET MVC 4.0 Developer Preview 已发布[19]
2012-02-15 ASP.NET MVC 4.0 Beta 随着Microsoft .NET Framework 4.5 RC发布[20]
2012-05-31 ASP.NET MVC 4.0 RC [21]
2012-08-15 ASP.NET MVC 4.0 [22]
2013-10-17 ASP.NET MVC 5.0 [23]
2014-01-17 ASP.NET MVC 5.1 [24]

授权[编辑]

ASP.NET MVC Framework虽然是ASP.NET的一部分,不过它的源代码是通过Microsoft Public License (MS-PL)的授权模式公开,因此在MS-PL授权的范围内,任何人是可以去查看与修改它的源代码的。[25]

ASP.NET MVC Razor Engine[编辑]

微软在2010年7月2日由Scott Guthrie发表新的MVC绘制引擎 (Render Engine):Razor Engine[26],它已内置于 ASP.NET MVC 3.0 中发布,它具有下列功能:

  1. 更轻量化且直觉的语法,减少在 View 中输出数据时使用的语法,让 View 的指令更加简洁,例如使用 "@" + 变数名称 的方式,就可以输出程序中的变数,不必再用 <% %> 来设置。如果程序有多行,可以使用 @{ } 的方式来设置。
  2. 容易学习。
  3. 可兼容于现在的编程语言 (ex: C#)。
  4. 通过 Visual Studio,可享有 Intellisense 能力。
  5. 可混用 HTML 与编程语言指令。
  6. 可用各种不同的文本编辑器编辑。
  7. 具有单元测试的能力。

参考资料[编辑]

  1. ^ Controllers and Action Methods in MVC Applications
  2. ^ Models and Model Binders in MVC Application
  3. ^ Views and UI Rendering in MVC Applications
  4. ^ Models and Model Binders in MVC Applications
  5. ^ Validating Model Data in an MVC Application
  6. ^ Oxite Refers
  7. ^ ASP.NET MVC Preview 4 Released - Shiju Varghese's Blog. Retrieved from http://weblogs.asp.net/shijuvarghese/archive/2008/07/16/asp-net-mvc-preview-4-released.aspx
  8. ^ ASP.NET MVC CodePlex Preview 5 Release Notes. Retrieved from http://www.codeplex.com/Release/ProjectReleases.aspx?ProjectName=aspnet&ReleaseId=16775.
  9. ^ http://go.microsoft.com/fwlink/?LinkID=129910&clcid=0x409
  10. ^ http://go.microsoft.com/fwlink/?LinkID=141184&clcid=0x409
  11. ^ http://go.microsoft.com/fwlink/?LinkId=144443
  12. ^ http://go.microsoft.com/fwlink/?LinkId=144444
  13. ^ http://go.microsoft.com/fwlink/?LinkID=154409
  14. ^ http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=36054
  15. ^ http://weblogs.asp.net/scottgu/archive/2010/03/11/asp-net-mvc-2-released.aspx
  16. ^ http://aspnet.codeplex.com/releases/view/54306
  17. ^ http://go.microsoft.com/fwlink/?LinkID=191797
  18. ^ http://www.asp.net/mvc/mvc3
  19. ^ http://aspnet.codeplex.com/wikipage?title=ASP.NET%20MVC%204%20RoadMap
  20. ^ http://www.asp.net/whitepapers/mvc4-release-notes
  21. ^ http://www.asp.net/mvc/mvc4
  22. ^ http://www.asp.net/mvc/mvc4
  23. ^ http://www.nuget.org/packages/Microsoft.AspNet.Mvc/5.0.0
  24. ^ http://www.nuget.org/packages/Microsoft.AspNet.Mvc/5.1.0
  25. ^ ASP.NET MVC 1.0 on ScottGu blog
  26. ^ Introducing “Razor” – a new view engine for ASP.NET

转载 : 给不能翻墙的伙伴们看看 , 开拓下视野!  http://so.chongbuluo.com/

ASP.NET MVC Framework的更多相关文章

  1. 理解ASP.NET MVC Framework Action Filters

    原文:http://www.cnblogs.com/darkdawn/archive/2009/03/13/1410477.html 本指南主要解释action filters,action filt ...

  2. ASP.NET MVC framework 学习

    http://www.cnblogs.com/lmfeng/archive/2013/03/28/2986123.html  MVC数据绑定方式 http://www.cnblogs.com/lmfe ...

  3. asp.net mvc 之旅 —— 第六站 ActionFilter的应用及源码分析

    这篇文章我们开始看一下ActionFilter,从名字上其实就大概知道ActionFilter就是Action上的Filter,对吧,那么Action上的Filter大概有几个呢??? 这个问题其实还 ...

  4. ASP.NET MVC随想录——锋利的KATANA

    正如上篇文章所述那样,OWIN在Web Server与Web Application之间定义了一套规范(Specs),意在解耦Web Server与Web Application,从而推进跨平台的实现 ...

  5. 使用ASP.NET MVC操作过滤器记录日志(转)

    使用ASP.NET MVC操作过滤器记录日志 原文地址:http://www.singingeels.com/Articles/Logging_with_ASPNET_MVC_Action_Filte ...

  6. ASP.NET MVC 随想录——探索ASP.NET Identity 身份验证和基于角色的授权,中级篇

    在前一篇文章中,我介绍了ASP.NET Identity 基本API的运用并创建了若干用户账号.那么在本篇文章中,我将继续ASP.NET Identity 之旅,向您展示如何运用ASP.NET Ide ...

  7. Asp.net MVC十问十答[译]

    1. Explain MVC (Model-View-Controller) in general? MVC (Model-View-Controller) is an architectural s ...

  8. Asp.net MVC 版本简史

    http://www.dotnet-tricks.com/Tutorial/mvc/XWX7210713-A-brief-history-of-Asp.Net-MVC-framework.html A ...

  9. ASP.NET MVC (一)

    工作清闲好一段时间了,趁这段时间弄了弄PHP,做个了简单的MVC网页.玩了玩Android,弄了个拨号器,发短信的,嘿嘿,最满意的还是两天弄了个数独游戏.不务正业一个多月了,也该磨磨刀,接下来一段时间 ...

随机推荐

  1. c++游戏编程书籍

    如果要自学游戏程序开发的话,可以看看下面的,呵呵. 游戏开发资料(PDF书都是中文版的,非英文,很多是本人自己扫描制作,从未网上发布过,所以独家啦):  1.Gamebryo 2.2游戏引擎(盛大.腾 ...

  2. UberX及以上级别车奖励政策(优步北京第一组)

    优步北京第一组: 定义为2015年6月1日凌晨前(不含6月1日)激活的司机(以优步后台数据显示为准) 滴滴快车单单2.5倍,注册地址:http://www.udache.com/如何注册Uber司机( ...

  3. 网易云课堂_C语言程序设计进阶_第6周:程序结构

    6.1 全局变量 6.2 编译预处理 6.3 大程序结构 6.1 全局变量 全局变量 定义在函数外面的变量是全局变量 全局变量具有全局的生存期和作用域 它们与任何函数都无关 在任何函数内部都可以使用它 ...

  4. android 内存优化

    OOM 内存泄漏引起很多问题: 1:节目卡顿.反应慢(高内存使用情况JVM 虚拟机的频繁离职GC) 2:消失 3:直接崩溃 ANDROID 内存面临的问题 1: 有限的堆内存,原始仅仅有16M 2:内 ...

  5. 【原创】重绘winform的GroupBox

    功能:重绘winform的GroupBox,以便调整边框颜色和边框宽度 using System; using System.Collections.Generic; using System.Com ...

  6. debug jdk

    1.解压jdk安装路径中的src.zip如:c:\src. 注意一般只选择编译java javax org 三个文件夹就足够了,剩余的文件夹删除掉 2.列出要编译的源文件:dir /B /S /X c ...

  7. java学习之异常笔记

    异常处理使用try catch finally throw throws 如果try中有执行到return后, 也会执行finally中的语句之后再跳出方法. 异常是对于某种错误情况的描述,是告诉方法 ...

  8. iOS RTMP 视频直播开发笔记(1) – 采集摄像头图像

    1. 采集硬件(摄像头)视频图像 这里简单说下 iOS 的摄像头采集. 首先初始化AVCaptureSession,说到Session,有没有人想到AVAudioSession呢? // 初始化 AV ...

  9. Csharp多态的实现概述

    (1)什么是多态, 多态就是一个类表现出多种不同的形态, 他的核心是子类对象作为父类对象使用 (2)怎么实现多态, 在Csharp中,可以用接口, 虚方法, 抽象类实现多态,当然,不管是这三种的那一个 ...

  10. HDFS之HBase伪分布安装

    1.HBase简介 HBase是Apache Hadoop中的一个子项目,Hbase依托于Hadoop的HDFS作为最基本存储基础单元,通过使用hadoop的DFS工具就可以看到这些这些数据 存储文件 ...