.net framework组成元素
基底类别库(BCL)
提供开发各种解决方案时所需使用的物件
所有的.net语言皆使用同一组
将各种不同解决方案的模型一致化
共同语言执行时期(CLR)
提供所有.net程序语言执行程式时的服务
提供自动记忆管理
提供与COM元件互通的能力
内建多执行绪执行能力
中介语言格式IL
由微软所指定,是CLR的组合语言
所有.net程式语言编译器的目标格式皆为IL
可在不同平台,跨平台使用
编译成原生码之后的执行,仍被CLR管理
组件的搜寻规则:
从GAC中找(搜寻组件公用快取)
如果没有找到,不过有组态设定档存在,则搜寻组态设定档所指定的位置。
如果还是没有找到,.net会搜寻执行档所在的目录
如果还是没有找到,应用程式将发生错误并结束执行、
部署的选择
XCOPY Deployment
注册到GAC中
透过.Config
物件的导向程式设计
物件——对象
属性——属性
行为——方法
物件的复制
e.Clone()
物件的产生
Dim e as employee
e=new employee();
Dim e as new employee()
物件的毁灭(回收空间)
GC资源收集器来自动回收,会周期性地自动执行
虽然GC帮我们减少了很多工作,但有时大文件空间的时候,最好还是要自己手动回收一下。
方法:
Obj.Dispose()
Obj=Nothing '让物件变成没有被参考
装箱(Boxing)
所有的东西不见得都是物件
实质型,放在堆点里面, 当成物件来看,tostring()装箱
方法Method
用来执行一些动作的程式,就是Method
多载(Overloading)其实就是函数的重载(可能版本有点老吧,说法都没跟上时代潮流)
多个名称相同的方法
资料的保护(就是访问修饰符)
尽可能的将资料隐藏起来。(将内部成员限制访问)
属性的操作
set方法与get方法
只读 ReadOnly 关键字
只写 WirteOnly 关键字
好处:
可以通过方法来对这个属性做一些判断或修改
Shallow copy
Deep copy(需要自己写两层复制)
常量和共享
Const
Shared(共用成员)
共用成员不用创建物件(不用实例化)直接用类名.属性或方法
列举型别(Enum)
就是枚举类型
模组
Public Module _name
End Module
命名空间
Namespace _name
End Namespace
命名空间可以嵌套,空间里可以有子空间。增加可读性,把一类的东西分到一个空间中,好区分,减少类名的冲突。
使用:
完整参照(完整的名字)
优点:确保对象的类型正确
缺点:代码冗长
导入命名空间
Imports
就可以只写最关键的类名
导入太多命名空间可能会:妨碍程序的可读性,增加名称冲突的风险
折衷方法:建立命名空间的别名。
Imports BT=TeamX.BusinessTier
…
Dim c as BT.customs
集合
ArrayList 还可以排序
HashTable
使用vs建立类别库,类别库将会编译成DLL
方式1:加入DLL参考
执行起来较有效率,因为只有一个专案
当Dll变更之后,必须手动重新 编译
方式2:加入专案
将自动编译DLL
会在背景编译变更过的元件,这会导致暂时停止回应。
多对一的事件处理
Private Sub form_load(…) Handles button1.click,button2.click
Message.show("Changed!")
End Sub
一对多的事件处理
在執行時期可以動態加入或移除事件與事件處理的關連
*範例: *在按鈕的事件中,呼叫 AddHandler 或是 RemoveHandler
Private Sub cmdMonitor_Click(…) Handles cmdMonitor.Click
Dim txt As TextBox, c As Control
For Each c in Me.Controls
If TypeOf c Is TextBox Then
txt = c
AddHandler txt.TextChanged , AddressOf Me.Common_TextChanged
End If
Next
End Sub
WinForms
AutoScroll属性
Anchor属性(固定控件的位置)
窗体调用显示
窗体是类,引用时需要new
Show 会可以往下执行
ShowDialog 会此窗体被关闭才会往下执行
物件的毁灭
无法自行毁灭物件
物件只能被garbate collector所毁灭
我们可以选择释放资源
呼叫Dispose方法
表单物件为例,可以呼叫close或dispose方法
明确型别转换
Option Strict On 开启明确型别转换
Option Explicit On 开启显示声明
例外处理
发生了预期之外的状况
例如: 除零錯誤
數值溢位
存取陣列超過界限
物件參考不存在
檔案不存在
無法存取資料庫
每一个例外都被视为物件,通过throw掷出,通过catch方式捕捉
例外的类别
System.SystemException系統定義的例外
System.ApplicationException使用者自訂的例外
处理
使用try-catch语法
Try
statement1
statement2
Catch ex As Exception
statement4
Statement5
Finally
Statement6
Statement7
End Try
(ps:Throw New System.ApplicationException(“File not found!”,ex) 扔出一个新的错误例外)
应用程式的追踪
追踪会记录有关从程式执行的讯息
开放式资料库设计
栏位
栏位是具有型别的(string,int。。。)
主索引键(primary key)
关联
一对多
一对一
多对多
资料库正规化
第一阶正规化:一个栏位中只包含一个“原子”的资料
1NF,2NF,3NF,…
不要有重复的资料,资料只要储存一次
命名规则很重要
资料库管理系统(DBMS)
资料
资料库引擎JET
要求→ 资料库引擎 → 资料
类型:MS SQL Server, Oracle, DB2, MySQL
工具
SQL Server
Query Analyzer : 執行 T-SQL 語法
服務管理員 : 啟動或停止 SQL Server
Enterprise Manager : 管理 SQL Server
Microsoft Access
建立資料庫、查詢、…
使用 JET 引擎,免費
其它:
使用 Visual Studio .NET 中的伺服器總管
WebMatrix 整合開發環境 (http://www.asp.net/)
结构化查询语言(SQL)
DML:Data Manipulation Language (select, update, …)
DDL:Data Definition Language (create, drop, …)
DCL
Join table_name on
Outer join
Insert
Update
Delete
删除记录的时候,最好多设置一个字段来标记已不被使用,不要真的删除,这会节省效率,也会减少不必要的麻烦。
预储程序(存储过程)
可以接受參數
可以回傳資料表
預先編譯、最佳化過 – 幾乎是十倍快
优点:
*執行快速
*將複雜的 SQL 程式封裝起來
*提供另外一層的存取控制能力
*大部份的資料庫提供者都支援
*SQL Server, Oracle, etc.
*缺點: *每個資料庫提供者的預儲程序語法都不一樣
*預儲程序不容易轉換成其它格式的程式
ADO.NET架构
资料提供者
原生提供者: SQL Server , Oracle
非原生提供者: OLEDB , ODBC
核心命名空间
一般: System.Data, System.Data.Common
SQL Server: System.Data.SqlClient
Oracle: System.Data.OracleClient
OleDB: System.Data.OleDb
ODBC: System.Data.Odbc
存取方式
资料读取与写入
DataReader类可以逐一读取资料
只能下一个,唯独的游标
存取资料步骤
1、开放资料库连线
2、进行资料库操作(读取)
3、关闭资料库连线
DataSet
就是一个在记忆中的资料结构,用表格的方式来储存
DataSet = 離線式的 Recordset
資料是由伺服端複製回來
然後在用戶用端離線處理資料
允許你 :
減少資料庫伺服器的負載
關閉資料庫連線,並且離線處理資料
特別是在分散式應用程式中特別有用
使用DataAdapter类填满DataSet类
sql = "Select * From Products;"
.
.
.
Dim adapter As ss.SqlDataAdapter, ds As System.Data.DataSet
dbConn = New ...
dbCmd = New ...
adapter = New ss.SqlDataAdapter(dbCmd)
ds = New System.Data.DataSet()
dbConn.Open()
adapter.Fill(ds)
dbConn.Close()
ds.Tables(“Table”).TableName = “Products” ‘** 修改 DataSet 中表格的名稱 …
DataSet :
可以儲存你想要處理的所有資料
可以搜尋、排序、修改
範例:
將整個 Sales 資料庫的資料填滿 DataSet
sql = "Select * From Customers; Select * From Orders; " & _
"Select * From OrderItems; Select * From Products;"
.
.
.
dbConn.Open()
adapter.Fill(ds)
dbConn.Close()
工具
首先制定协定
Interface
使用implements 来实现
第二步才是实作
必须实现接口中的每一个方法,否则无法编译
优点:
统一了方法,当具体行为改变时,不用改变客户端的程序。
多型
就是声明接口,实例不同对象,就可以达到程序不用修改的效果
物件的复制
IClonable
Public Class Customer: Implements IClonable
Private m_Name As String
Private m_Email As String
Private m_Balance As Decimal
...
Public Function Clone( ) As Object Implements ICloneable.Clone
Return Me.MemberwiseClone( ) ‘** returns a shallow copy...
End Function
IComparable接口
比较两个物件,并传回一个数值(使用ASCII码来比较)
< 0 表示 obj1 < obj2
= 0 表示 obj1 = obj2
> 0 表示 obj1 > obj2
Public Interface IComparable
Function CompareTo(obj As Object) As Integer
End Interface
泛用型资料层
通过选择判断来决定实例化具体的那个数据库对象连接。
继承的基础
inherits继承
术语
Base/Super/Parent
Derived/Sub/Child
特点:单继承。就是只能继承一个对象
重写与动态细节
Overridable:定义为可重写的方法
Overrides 来重写
就是动态方法和静态方法
静态方法比较快,因为要呼叫的方法已经预先决定。
动态方法比较有弹性,因为是动态的。
基底类别的设计
必须被继承和必须被重写
MustInherit
MustOverride
限制不被继承
NotInheritable
Equals和GetHashCode
如果物件是相等的,那么GetHashCode必须要相等
资料存取的一般化
连线的开启与关闭
单一或少数使用者的情况:保持连线开启
多使用者的情况:用时开,用完就关闭。
连线集区(Pooling)
连线会存放到集区中
一般资料存取的问题
SQL指令隐码攻击(注入)
验证输入
Regular expressions
友谊类别
Friend
资料层的设计
多层次设计:模组化、弹性、重复使用
重量化和轻量化
商业逻辑层的设计
支持流程中所有安全性、逻辑与资料存取(验证、维护、存储)
具型别DataSet
Dim DS As System.Data.DataSet
Dim customersDS As DataTier.CustomersDataSet
.
.
.
dataAdapter.Fill(DS)
dataAdapter.Fill(customersDS)
‘ 一般的 dataset 存取方式
FirstName = DS.Tables(“Customers”).Rows(i).Item(“FirstName”).ToString()
‘ 具型別 dataset
FirstName = customersDS.Customers(i).FirstName
ORM Framework
组件
建立一个DLL组件
组件层级的attributes
强式名称
数字签章
.snk挡
com元件
互通机制
.net呼叫com元件
建立ccw
interop的运作
应用程式设计
(1)整体的:布署单一的 .exe+ .net 到用户端
(2)分层结构的, .exe, DLLs , .net 到用户端
(3)远端,布署到用户端与服务端
(4)以web为基础的,布署web网页,DLLs+.net到web服务器
应用程式布署
.net必须安装
CLR + FxCL必须安装在 .exe执行的主机上
组件manifest
AppBase
.exe所在的位置称为AppBase,应用程式的主目录
布署选项
XCOPY布署
将exe,dlls+相关档案,全部拷贝到同一个资料夹
零接触布署
给exe一个url,用户直接透过ie浏览url
NET 將 AppBase 設定到 Web 伺服器上的虛擬目錄 !
.NET 從 AppBase 下載 .EXE 和 .DLLs
問題: 安全性? 如何下載必要的檔案 (資料庫)
组建搜寻演算法
版本转向
应用程式的.config挡设计可以重写.exe manifest
GAC
Global Assembly Cache
位於 C:\Windows\Assembly
直接用檔案總管就可以檢視…
安装组件到GAC
组件必须有强式名称,使用gacutil.exe命令列工具(要有管理员权限)
CodeBase
共用布署
将共用的各版本组件安装到GAC
具有强式命名的组件载入的效率比较快
下载布署
使用CodeBase来指定DLLs位置
潜在的问题:
(1)config档hell问题
(2)程式码逆向工程
(3)程式码存取安全性
通过reflection机制手动布署
是一种在执行阶段针对组件进行处理的机制
载入组件
建立物件
检查栏位、方法、属性的规格
存取栏位、方法、属性
分散式设计
同步
用户端呼叫服务端,然后等待回应
简单,传统的程式设计模型
基于RPC的基础上
RPC架构
Proxy-stub物件用来建立爽法的同步呼叫机制
proxy是在用户端,stub在服务端
常见的同步设计
Form-based web 应用程式(webForms)
浏览器解决方案,要求某一页,等待服务器传回html
Web service
呼叫web方法,等待xml资料传回来
连接不同平台的应用程式
Remoting
程式,呼叫方法,等待结果传回来
两端都是.net平台
连接.net平台下各层的元件(例如,java和.net)
例如:
.NET on Linux & .NET on Windows
.NET on WinXP & .NET/COM+ on Win2003
非同步
用户端传送要求,然后用户继续进行其它工作,服务端执行完后在将回应传给用户端
比较有弹性
比较难设计、实作、测试
Remoting设计
Sales物件是一个“single-call MBRO”
使用IIS(web server)
很容易开发和设定服务端
可以使用windows安全机制
Web services
WSDL=web service description language
.net web service
步骤:
1、建立一个asp.net web 服务专案
2、专案位置=http://localhost/SalesWebService
3、参考businessComponent.dll
4、将sercicel.asmx改名为Sales.asmx
5、撰写Sales.asmx的程式码Sales.asmx.vb
指的是有多个操作会同时执行的程式。
Concurrency
多个操作同时执行
范例
web服务器慧颖多个浏览器的要求
资料库服务器处理多个查询
怎么办到?
实际上,一个cpu会在多个程式之间快速切换,看起来就像同时执行
cpu切换
由硬件切换
每隔一段时间,程式暂停、等候回应
行程(process)
多行程
多执行绪
多执行
设计上很困难
1、协调问题
通过执行绪通讯协调
等待彼此执行结束
join:值得就是等待执行绪执行完
一直等
等一段时间(带参数)
检查执行绪执行状况
IsAlive
2、通讯问题
参数
结果
执行过程中的变数值
使用队列
执行绪使用dequeue方法从队列取出资料
执行绪使用enqueue方法将资料加入队列
3、同步问题
使用syncLock指令
只有一个执行绪可以进入,其它执行绪要等
使用执行绪安全的队列物件
多执行绪很难设计
很多细节要注意
很难证明执行结果一定正确
很难进行侦错
可能产生死结(deadlock)
必须在执行绪中处理例外
delegates
是一种方法的指标,可以做呼叫端与被呼叫端的抽象化。
在执行绪上的另一层抽象化
内建支援多执行绪
更有效率:因为使用执行绪集区(thread pool)
支持参数传进与传回值
所谓的“软体工程”其实就一个软体开发程序,依循这些程式就可以开发出稳定、可靠的软体系统,这些开发程序也可以不断重复使用、不断改良
软体工程
背景:
软件越来越困难
软件应用在重要的系统上
软件甚至用在和生命相关的系统上
一般的做法:
传统“瀑布式”模型
1.需求分析
2.设计
3.实作
4.单元测试
5.整合测试
6.布署
7.维护
最近流行的“eXtreme Programming”模型
一个非常不同、比较精简快速的流程
主要原则:
把客户整合到软件开发流程中
随时设计
随时测试
不做过当的设计,越简单越好
工具
UML绘制工具
程式码分析工具:
FxCop
测试工具:
NUnit是一个免费的单元测试工具
原始码管理工具:
版本管理工具(Visual SourceSafe 、CVS 、 WinCVS)
文件产生工具:
XML注解
Make工具:
是一个在Unix系统上常用的工具,用自动化整个软件的组建(编译)流程。
NMake是视窗版的
我好像学了一门古老的语言,而且跟语法都没有关系,介绍了从最初的程序设计到后来的软件工程,从软件设计到程序的编译会产生什么文件,需要那些系统工具的支持,比如CLR、DLL等等,再到软件的部署、维护用到的技术、工具和方法,从一个更加接触底层的角度去学习了软件的整个流程。
视频里面讲了好多都不认识的系统软件,原来我们编写的程序要真正的发布运行还需要学习很多的东西,不仅仅只是写完代码就ok了,还要考虑不同平台上的运行,并发操作带来的问题,需要有什么样的支撑环境等等一系列的工作。