官术网_书友最值得收藏!

1.1 理解.NET Framework

.NET框架用來運行.NET應用程序,對于客戶端應用程序,比如WPF或Windows Forms桌面應用程序,客戶端電腦必須安裝這個應用程序框架才能運行程序。對于服務器應用程序來說,在部署之前必須安裝.NET Framework框架,比如要部署ASP.NET程序時,必須要先安裝.NET Framework運行庫,Web應用程序才能正常服務客戶端的請求。

1.1.1 什么是.NET Framework

.NET Framework是微軟主推的應用程序開發框架,由一系列的基礎架構組成,支持多語言開發,比如C#、VB.NET、F#、C++。其中C#是.NET Framework框架上主要的程序設計語言。

.NET Framework由以下兩個主要的組件組成。

● 公共語言運行庫(Common Language Runtime,CLR):負責控制.NET Framework應用程序執行過程中的方方面面,如管理內存、線程的執行、代碼的執行、代碼級別的安全驗證、中間語言編譯等。

● .NET基礎類庫:提供程序運行時特性和經常用到的上層服務,使用命名空間把這些功能按層次組織起來。

公共語言運行庫是.NET的核心,CLR是.NET框架支持多語言開發的一個引擎,所有的.NET托管代碼都在CLR中運行,如運行一個ASP.NET Web頁面或者是一個Windows Forms應用程序。.NET CLR就像是.NET平臺上的一個大管家,負責管理語言的類型安全、垃圾回收、異常處理、向下兼容等語言特性,CLR為開發者提供了如下服務:

● 多語言集成開發:CLR可以在多種語言之間緊密無縫地進行交叉引用,例如可以用VB.NET開發一個基類,然后在C#代碼中直接派生出一個派生類。

● 自動內存管理:使用.NET提供的垃圾回收機制,當對象或變量的生命周期結束后,不需要程序員顯式地調用析構函數進行釋放,CLR會自動釋放它們所占用的內存。

其他的一些服務包含跨語言的異常處理、版本控制、安全性控制互操作及自描述組件等,.NET框架的整體結構如圖1.1所示。

圖1.1 .NET 框架的整體結構圖

位于CLR的上層是.NET框架類庫,提供了大量的已經預定好的功能供應用程序使用,這些類庫使用命名空間進行良好的組織,按特定的技術集進行組織,比如與數據庫訪問相關的ADO.NET或者是WPF類庫。

位于類庫上層的是通用語言基礎CLI,通用語言基礎架構定義了構成.NET Framework基礎結構的可執行碼,以及代碼的運行時環境的規范,它定義了一個語言無關的跨體系結構的運行環境,這使得開發者可以用規范內定義的各種高級語言來開發軟件,并且無須修正即可將軟件運行在不同的計算機體系結構上。

1.1.2 .NET Framework 4.0的新增功能

每一個版本的革新總會伴隨大量新的功能特性出現,在.NET Framework 4.0中,包含了大量的新增功能,其中比較核心的特性如下。

● 動態語言運行時DLR:是一套基于.NET的類庫,用來簡化在.NET CLR上開發動態語言的工作。

● 整合托管擴展性框架MEF(Managed Extensibility Framework):用來開發動態的、可擴展的應用程序的一組類庫。

● 支持并行計算:包括對PLINQ的支持、并行語言語句等,對己有的基類庫進行了擴充和增強,用來支持并行特性。

● ADO.NET的增強:增強了ADO.NET Entity Framework的一些功能。

● 對WCF和WF框架的增強支持。

.NET Framework 4.0中的新增功能可以參考MSDN中關于新增特性的介紹,從語言到類庫,.NET Framework 4.0提供了大量與時俱進的功能,如多核并行計算特性、對開源項目MEF的整合等。

1.1.3 ASP.NET 4.0簡介

ASP.NET并不是.NET平臺上的一門語言,而是基于.NET Framework的一套Web開發框架,與Windows Forms或WPF一樣,可以使用任何支持.NET平臺的語言,如VB.NET或C#進行開發。

如果說得更精確一點,ASP.NET是.NET Framework平臺上的一門用于開發服務器端Web應用程序的類庫。微軟在服務器端Web頁面上最早發布的版本是ASP技術,隨著.NET框架的推出,相應地推出了ASP.NET版本。服務器端的Web頁面與靜態客戶端頁面,如純HTML頁面的最大不同在于動態頁面功能,靜態頁面是固定不變的,而服務器端ASP.NET頁面將由IIS服務器進行編譯然后發布,其運行示意如圖1.2所示。

ASP.NET與其他的Web開發技術(如JSP或PHP)的最大不同在于它的基于事件的Web窗體編程模型,這類似于Windows Forms的編程,通過對控件的各種事件進行編程,由于ASP.NET基于HTTP的無狀態協議,因此為了實現這種交互式的編程模型,ASP.NET使用了多種技術來保存客戶端狀態,如典型的視圖狀態或者會話狀態。

圖1.2 動態Web頁面的請求與響應示意圖

為了實現這種基于事件的編程模型,ASP.NET提供了一系列的服務器控件,在事件觸發時,HTTP運行時將負責根據用戶的動作來向服務器端發送事件通知。

注意:ASP.NET引擎會對服務器端對象的狀態進行編碼,將其狀態保存在客戶端的隱藏字段中,運行時會解碼這些狀態數據,并使用解碼后的狀態信息來創建服務器端對象的新實例。

ASP.NET編程模型提供了服務器端控件與HTML頁面元素的映射,一些組件與HTML元素具有一一映射的關系,而大多數復雜的控件由多個HTML標簽組合實現,如Calendar或GridView這類復雜的控件。

1.1.4 ASP.NET MVC簡介

在過去,ASP.NET程序員一直想像Java一樣具有類似Struts和Spring的MVC框架,微軟公司推出了ASP.NET MVC框架,這對于很多模式愛好者或是面對復雜項目的程序員來說是一個令人激動的事情。

MVC模式(Model-View-Controller)是軟件工程中的一種軟件架構模式,把軟件系統分為3個基本部分:模型(Model)、視圖(View)和控制器(Controller),這3個部分的作用如下。

● 控制器Controller:負責轉發請求,對請求進行處理。

● 視圖View:界面設計人員進行圖形界面設計。

● 模型Model:程序員編寫程序應有的功能(實現算法等)、數據庫專家進行數據管理和數據庫設計(可以實現具體的功能)。

這種分離的模型有助于對ASP.NET應用程序與單元測試,同時對于大型且復雜的項目來說,便于多個程序員分工合作,也便于后期維護。ASP.NET MVC提供了相較于傳統的ASP.NET Web窗體編程模型的一種選擇,但它不是對ASP.NET Web窗體程序的一種替代。

ASP.NET的MVC的實現有些特別,用戶對ASP.NET頁面的請求被直接重定向到控制器的方法中,這些方法稱為控制器行為。控制器負責與模型進行通信,將數據傳遞給視圖交由用戶端進行顯示,正是因為這樣的編程模型,因此在開發ASP.NET MVC應用程序時,將需要關心URL路由、控制器返回的視圖、同時因為視圖與控制器這種分離的特性,在ASP.NET MVC中可以使用多種視圖引擎來顯示控制器傳回的數據。

1.1.5 ADO.NET Entity Framework 概述

ADO.NET Entity Framework又稱ADO.NET實體框架,是微軟提供的ORM對象關系映射框架,這是一個類似NHibernate的ORM框架,目的是提高數據庫編程的抽象級別,實體框架以實體數據模型(EDM)為主,將數據邏輯層切分為3塊(概念架構、映射架構與存儲架構),其上還有實體客戶端、數據上下文及LINQ可以使用,如圖1.3所示。

圖1.3 ADO.NET Entity Framework架構圖

1.概念架構

所謂概念架構,是指定義了對象模型(Object Model),讓上層的應用程序碼可以使用面向對象的方式訪問數據,概念層結構是由CSDL(Conceptual Schema Definition Language)概念架構定義語言所撰寫的,一個CSDL概念架構定義語言代碼片斷如代碼1.1所示。

代碼1.1 CSDL概念架構定義語言代碼片斷

<!-- CSDL content -->
<edmx:ConceptualModels>
  <Schema Namespace="TaskManagerModel" Alias="Self" xmlns="http://schemas.microsoft.com/ado/2006/04/edm">
    <EntityContainer Name="TaskManagerEntities">
      <EntitySet Name="Category" EntityType="TaskManagerModel.Category" />
      <EntitySet Name="Resource" EntityType="TaskManagerModel.Resource" />
      <EntitySet Name="Task" EntityType="TaskManagerModel.Task" />

2.映射架構

映射架構負責將上層的概念層結構及下層的存儲體結構中的成員結合在一起,以確認數據的來源與流向。對應層結構是由MSL(Mapping Specification Language)映射規范語言所撰寫的,代碼片斷如代碼1.2所示。

代碼1.2 MSL映射規范語言代碼片斷

<!-- C-S mapping content -->
<edmx:Mappings>
  <Mapping Space="C-S" xmlns="urn:schemas-microsoft-com:windows:storage:mapping:CS">
  <EntityContainerMapping StorageEntityContainer="TaskManagerModelStoreContainer" CdmEntityContainer="TaskManagerEntities">
     <EntitySetMapping Name="Category">
       <EntityTypeMapping TypeName="IsTypeOf(TaskManagerModel.Category)">
         <MappingFragment StoreEntitySet="Category">
           <ScalarProperty Name="CategoryID" ColumnName="CategoryID" />
           <ScalarProperty Name="Name" ColumnName="Name" />
           <ScalarProperty Name="Description" ColumnName="Description" />
         </MappingFragment>
       </EntityTypeMapping>
     </EntitySetMapping>

3.存儲架構

存儲層結構是負責與數據庫管理系統中的數據表做實體對應,讓數據可以輸入正確的數據來源,或者由正確的數據來源取出。它是由SSDL(Storage Schema Definition Language)存儲架構定義語言所撰寫的,代碼片斷如代碼1.3所示。

代碼1.3 SSDL存儲架構定義語言代碼片斷

<!-- SSDL content -->
   <edmx:StorageModels>
   <Schema Namespace="TaskManagerModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2005" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStore SchemaGe nerator" xmlns="http://schemas.microsoft.com/ado/2006/04/edm/ssdl">
      <EntityContainer Name="TaskManagerModelStoreContainer">
        <EntitySet Name="Category" EntityType="TaskManagerModel.Store.Category" store:Type="Tables" Schema="dbo" />

當定義好實體數據模型CS/MS/SS之后,就可以利用ADO.NET實體框架的用戶端來訪問EDM,EDM中的數據提供者會向數據來源訪問數據,再傳回用戶端,如可以使用LINQ to Entities查詢實體模型中的數據。

4.微軟Visual Studio 2010的實體生成工具

在微軟Visual Studio 2010中,所有這些架構語言的定義都由“ADO.NET實體模型設計器”來自動生成,如在使用設計器創建好了實體模型之后,可以在解決方案資源管理器中用鼠標右鍵單擊.edmx文件,在彈出的快捷菜單中選擇“打開方式”菜單項,在彈出的對話框中選擇“XML(文本)編輯器”選項,如圖1.4所示。

在XML文本編輯窗口中,就會看到實體模型設計器中生成的架構代碼,除此之外,Visual Studio 2010提供的模型瀏覽器提供了模型的樹狀視圖顯示,如圖1.5所示。

圖1.4 使用XML文本編輯器打開實體模型

圖1.5 Visual Studio 模型瀏覽器

還可以使用Visual Studio 2010提供的表映射工具來查看實體與表之間映射的詳細信息,如圖1.6所示。

圖1.6 Visual Studio表映射窗口

其實使用ORM的最大好處是與底層數據庫的隔離,實現了真正的數據庫無關性編程,便于將程序代碼部署到任何目標數據庫上,當然前提條件是這些數據庫能支持ADO.NET實體框架,以后會有越來越多的數據庫廠商開始支持ADO.NET實體框架,如MySQL、IBM、Sybase等。

1.1.6 ASP.NET 4.0 AJAX功能的增強

AJAX是異步JavaScript和XML的簡稱,是一種創建頁面無刷新的交互式網頁開發技術,AJAX由HTML、JavaScript、DHTML和DOM組成,使用AJAX可以獲得更快的頁面輸出和局部頁面更新的支持、具有豐富和高可響應的用戶界面、減少服務器端資源的消耗。

ASP.NET AJAX框架提供了在ASP.NET中應用AJAX技術的支持,ASP.NET AJAX主要由兩大部分組成,分別是服務器端組件和客戶端組件。

(1)服務器端的組件包含:

● 腳本服務:包含對AJAX的腳本的控制,例如調試、全球化、本地語系化等。

● Web服務:設置Web服務的路徑,讓AJAX客戶端可以獲取Web服務的參數。

● 應用程序服務:讓AJAX客戶端可以使用ASP.NET的成員角色服務和個性化服務。

● 服務器端組件:包含ASP.NET AJAX的4個主要控件。

(2)客戶端的組件包含:

● 組件:非可視化組件的支持。

● 瀏覽器支持:為個別瀏覽器所提供的支持。

● 網絡訪問支持:對網絡訪問的支持,包含異步處理、JSON、WebRequest、Web服務與應用程序服務。

● 核心部分:對JavaScript的基礎支持,例如事件、串行化、類型系統等。

在新近發布的AJAX 4.0中,包含了以下一些新增的AJAX功能。

(1)活動數據綁定:是指數據被實時綁定,即在數據源中的任何改變會立即更新到數據綁定控件,這是通過觀察者模式來實現的,Sys.Observer接口提供了在ASP.NET 4.0 AJAX中的活數據綁定的技持。

注意:這類數據綁定可以使用單向或雙向的綁定模式,對于單向綁定來說,如果模板已經輸出后數據源發生了變更,輸出數據不會被自動變更。

例如,下面的標記演示了如何在標記語言中指定單向綁定:

<h3>{{ FirstName }}</h3>  //單向綁定

對于雙向綁定來說,變更會自動改變己輸出的模板,或者在模板中的改變會自動變更后臺數據源的值,雙向綁定的代碼如下:

<input type="text" value="{binding FirstName}"/>  //雙向綁定

(2)支持Data Context和ADO.NET Data Service:AJAX在MicrosfotAjaAdoNet.js中包含了兩個數據上下文,分別是Sys.Data.DataContext和Sys.Data.AdoNetDataContext,通過這兩個上下文可以訪問ADO.NET數據服務或WCF服務。例如,可以使用下面的代碼訪問ADO.NET Data Service:

var dataContext = new Sys.Data.AdoNetDataContext();    //實體化AdoNetDataContext
dataContext.set_serviceUri("EmployeeDataService.svc"); //設置服務路徑
dataContext.initialize();                   //初始化上下文

代碼中指定的set_serviceUri被用于連接到ADO.NET Data Service或者是WCF服務。也可以使用DataContext類來連接ADO.NET Data Service,代碼如下:

<script type="text/javascript">
var dataContext = new Sys.Data.DataContext();       //實例化DataContext
dataContext.set_serviceUri("../EmployeeDataService.svc");  //設置服務路徑
dataContext.initialize();                  //初始化上下文
</script>

當然最好是使用AdoNetDataContext,該類擴展了DataContext類,提供了特定于ADO.NET的特性,如標識管理、變更管理、支持層次式數據及樂觀并發等。

(3)對觀察者模式的支持:使得一個普通的JavaScript對象發生改變時,將能觸發一個通知以便在代碼中進行處理,觀察者模式由Sys.Observer類提供。例如,下面的代碼使用Sys.Observer類實現了對于employee的變更觀察:

var employee = { name: "John Brownlow", address:"UK",status: true }//定義員工對象
var employeePublisher = Sys.Observer.observe(employee);       //創建觀察者
//添加屬性變更事件
Sys.Observer.addPropertyChanged(employeePublisher, employeeSubscriber);
employeePublisher.setValue("status", false);             //設置值
function employeeSubscriber(employee, eventArgs)          //屬性變更事件
{
    if (eventArgs.get_propertyName() == "status" && employee.status == false)
    {
      alert("該員工不在該組織中工作");                   //顯示提示消息
     }
}

代碼中一旦status屬性狀態發生變化,將會顯示一個警告消息。

(4)新增的DataView控件:DataView 控件用于綁定活數據,可以使用這個控件開發一個動態數據驅動的用戶控件。DataView控件位于System.UI.DataView命名空間中,包含兩個重要的屬性,分別是Data和DataProvieder,前者被用于綁定到一個JavaScript對象,后者用于連接到WCF服務。下面的標記代碼顯示了如何使用DataView控件顯示員工姓名和地址信息:

<body xmlns:sys="javascript:Sys"
   xmlns:dataview="javascript:Sys.UI.DataView"   //引入命名空間
   sys:activate="*">
   <ul sys:attach="dataview" class="sys-template"  //定義控件
       dataview:data="{{ dataArray }}">       //指定數據源
       <li>
           <h3>{{ EmployeeName }}</h3>     //設置單向綁定到員工姓名
           <div>{{ Address }}</div>        //設置單向綁定到地址
       </li>
   </ul>
</body>

上面的代碼中創建了一個DataView控件,綁定到dataArray數組中,然后分別指定綁定的屬性為EmployeeName和Address。

1.1.7 在ASP.NET中使用jQuery

jQuery是一個快速且簡潔的JavaScript類庫,該類庫用來簡化對HTML DOM的遍歷、事件處理、動畫及AJAX交互。jQuery的目標是改變程序員寫JavaScript代碼的方式,可以從http://jquery.com/中下載jQuery這套類庫的最新版本。

Visual Studio 2010版已經整合了jQuery的1.4.1版本,并且提供了對jQuery的智能感知的支持。在使用Visual Studio 2010創建一個Web應用程序項目后,可以在Script文件夾中看到用于jQuery的3個js腳本文件,如圖1.7所示。

圖1.7 jQuery腳本庫

這3個文件的作用如下。

● jquery_1.4.1-vsdoc.js:用于為Visual Studio 2010提供JavaScript智能提示的類庫文件。

● jquery-1.4.1.js:標準的jQuery類庫文件,包含了詳盡的注釋。

● jquery-1.4.1.min.js:壓縮后的jQuery類庫文件,用于發布程序,該文件的功能與標準版類似,但文件較小。

要使用jQuery,只需要在頁面中添加對min壓縮版類庫的引用,代碼如下:

<script language=javascript src="Scripts/jquery-1.4.1.min.js"></script>

添加了引用之后,在HTML代碼中就可以使用jQuery類庫,并且Visual Studio 2010將會提供中文化的代碼提示功能,如圖1.8所示。

使用jQuery的優勢是很明顯的,這套類庫提供了強大的功能函數,特別是選擇器,另外可以解決不同瀏覽器對于javaScript腳本的兼容性問題,jQuery也可以實現豐富的UI等功能,在本章的實例中,將會介紹jQuery的具體使用方法。

圖1.8 使用jQuery的代碼提示功能編寫代碼

主站蜘蛛池模板: 横峰县| 三江| 永昌县| 喜德县| 兰西县| 芒康县| 姜堰市| 富宁县| 云霄县| 仁寿县| 怀集县| 青海省| 通州市| 太原市| 景德镇市| 陆河县| 沂水县| 孟村| 思茅市| 汉沽区| 定兴县| 巴林左旗| 乾安县| 抚州市| 北辰区| 正定县| 平果县| 海口市| 海城市| 菏泽市| 卫辉市| 桓台县| 永吉县| 安丘市| 乌苏市| 刚察县| 连云港市| 综艺| 罗甸县| 郑州市| 兴山县|