軟件設(shè)計(jì)模式(一) - 開放文檔 - Free and Open …_第1頁
軟件設(shè)計(jì)模式(一) - 開放文檔 - Free and Open …_第2頁
軟件設(shè)計(jì)模式(一) - 開放文檔 - Free and Open …_第3頁
軟件設(shè)計(jì)模式(一) - 開放文檔 - Free and Open …_第4頁
軟件設(shè)計(jì)模式(一) - 開放文檔 - Free and Open …_第5頁
已閱讀5頁,還剩64頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

COM+潘愛民/CompCourse內(nèi)容COM復(fù)習(xí)COM+介紹COM+結(jié)構(gòu)COM+服務(wù)COM+開發(fā)ApartmentCOM組件COM客戶p->…Apartment{IXxx

*p;proxy}COM庫(ole32.dll)

COM庫(ole32.dll)COM庫(SCM,

rpcss.exe)Registry復(fù)習(xí):COM基礎(chǔ)機(jī)進(jìn)器程A

機(jī)進(jìn)器程B安全通道ORPC雙接口VB客戶復(fù)習(xí):COM技術(shù)總體結(jié)構(gòu)TypelibCOM基礎(chǔ)結(jié)構(gòu)化存儲(chǔ)可連接對(duì)象Automation永久對(duì)象UDTmoniker屬性頁事件

屬性變化通知ActiveX

ControlOLE嵌入對(duì)象In-place

activateCOM和COM+桌面應(yīng)用DCOM

C/S應(yīng)用COM+

ServicesCOM分布式應(yīng)用/企業(yè)應(yīng)用COM+:企業(yè)應(yīng)用從桌面應(yīng)用發(fā)展到企業(yè)應(yīng)用、Web應(yīng)用企業(yè)應(yīng)用特點(diǎn):大型、分布式、實(shí)現(xiàn)企業(yè)的關(guān)鍵業(yè)務(wù)企業(yè)應(yīng)用的挑戰(zhàn)關(guān)鍵業(yè)務(wù):業(yè)務(wù)邏輯基礎(chǔ)設(shè)施:涉及到系統(tǒng)方方面面開發(fā)、調(diào)試、測(cè)試、配置、維護(hù)如transaction、security、event等COM+是什么?面向企業(yè)應(yīng)用提供了企業(yè)應(yīng)用所需要的通用基礎(chǔ)設(shè)施設(shè)計(jì)企業(yè)應(yīng)用要求有思想上的根本變化COM+對(duì)COM的增強(qiáng)和改進(jìn)增強(qiáng)了COM

runtime

library增強(qiáng)了MTS(Microsoft

Transaction

Server)事務(wù)服務(wù)、安全服務(wù)提供了新的runtime服務(wù)隊(duì)列服務(wù)、事件服務(wù)、負(fù)載平衡、(內(nèi)存數(shù)據(jù)庫)COM+兼容COM,只是提供了更多的功能COM+的設(shè)計(jì)思想、目標(biāo)

使程序員和用戶把注意力和精力集中在業(yè)務(wù)邏輯上,而不是基礎(chǔ)設(shè)施上使組件盡可能地通用–編譯時(shí)刻特性與運(yùn)行時(shí)刻特性分離與以前的COM組件兼容客戶和組件的透明性COM+:interception技術(shù)COM對(duì)象機(jī)器、進(jìn)程或者套間邊界ProxyRPC通道StubClient

Policy

1Client

Policy

2Server

Policy

2Server

Policy

1COM+組件結(jié)構(gòu)COM+組件結(jié)構(gòu)——管理基本單元——功能基本單元COM+

ApplicationCOM+

ComponentsCOM+

ObjectsCOM+

Application–分為兩類:Server

Application,DllHost.exeLibrary

Application,與客戶共享進(jìn)程,仍然截取–共享同一個(gè)進(jìn)程,同一組屬性設(shè)置COM+Components為COM進(jìn)程內(nèi)組件COM+Objects為COM進(jìn)程內(nèi)對(duì)象COM+管理工具Component

Services

snap-in客戶創(chuàng)建COM+對(duì)象對(duì)客戶透明,使用增強(qiáng)了的COM庫客戶創(chuàng)建COM對(duì)象COM+runtime

services會(huì)檢查COM+的配置信息啟動(dòng)指定的服務(wù)進(jìn)程安裝interceptor,截取器在客戶方創(chuàng)建代理對(duì)象,并返回給客戶

COM+根據(jù)指定的應(yīng)用屬性管理服務(wù)進(jìn)程的生命周期COM+對(duì)于組件的要求要求DLL形式的組件要求自注冊(cè)DllRegisterServer、DllUnregisterServer要求有typelibtypelib既可以綁在dll上,也可以單獨(dú)的文件COM+Catalog(COM+目錄)COM+管理信息、系統(tǒng)數(shù)據(jù)庫COM+

Registration

Database通過一個(gè)對(duì)象層次結(jié)構(gòu)管理COM+CatalogCOM+Administration

Library,支持腳本

組件服務(wù)snap-in管理工具就是該對(duì)象模型的一個(gè)功能縮影用戶可以通過COMAdminCatalog組件進(jìn)入到對(duì)象模型中ProgID:COMAdmin.COMAdminCatalogCOMAdminCatalog管理功能COMAdminCatalog組件使用舉例Dim

Catalog

As

new

COMAdminCatalogDim

Applications

As

COMAdminCatalogCollectionDim

Components

As

COMAdminCatalogCollectionDim

AppObject

As

COMAdminCatalogObject"

get

the

Applications

collection

and

populate

itSet

Applications

=

Catalog.GetCollection("Applications")Applications.Populate"

get

the

correct

application,

My

ApplicationFor

Each

AppObject

in

ApplicationssIf

AppObject.Name

=

"My

Application"

Then

Exit

ForNext"

get

the

Components

collection

for

My

ApplicationSet

Components

=

Applications.GetCollection(

"Components"

,

AppObject.Key

)COM+Context(COM+環(huán)境)對(duì)象所生存的COM+狀態(tài)COM激活對(duì)象時(shí),創(chuàng)建context對(duì)象的環(huán)境與對(duì)象緊緊綁在一起根據(jù)組件的屬性決定環(huán)境的狀態(tài)環(huán)境屬性也是對(duì)象與客戶之間的約定如何訪問“環(huán)境對(duì)象”CoGetObjectContextGetObjectContextCOM+環(huán)境(續(xù))環(huán)境對(duì)象支持接口IObjectContextIGetContextPropertiesIObjectContextInfoIContextStateISecurityCallContext環(huán)境可以擴(kuò)充比如ASP對(duì)象COM+安全性安全性基礎(chǔ)設(shè)施對(duì)于分布式應(yīng)用至關(guān)重要Authentication——認(rèn)證(鑒定)Authentication

LevelSSP/SSPI——允許擴(kuò)展NTLM/KerberosCoInitializeSecurity安全與性能的平衡COM+安全性(續(xù)一)授權(quán)(Authorization)Role-based僅限于通過截取器的調(diào)用

通過程序來控制

ISecurityCallContext和IObjectControl提供了IsSecurityEnabledIsCallerInRole進(jìn)一步有ISecurityPropertyCOM+安全性(續(xù)二)服務(wù)進(jìn)程的身份(identity)DCOM方案:登錄到客戶機(jī)上的用戶——不再有效當(dāng)前交互用戶或者每個(gè)指定的用戶

三層結(jié)構(gòu)的兩種安全模型trusted

server

modelimpersonation/dele-gation

modelCOM+線程模型:STA和MTASTASTAMTA進(jìn)程COM+線程模型:TNATNA(Thread

neutral

apartment)不包含線程,只有對(duì)象,所有的對(duì)象與線程無關(guān)TNA中的對(duì)象ThreadingModel=Neutral創(chuàng)建線程總是接收到一個(gè)輕量級(jí)的代理調(diào)用時(shí),直接在調(diào)用線程中執(zhí)行TNA有希望替代“Free”和“Both”類型STA繼續(xù)生存,特別是包含UI的對(duì)象同步(synchronization)或者serializationSTA對(duì)象不需要同步,

MTA、TNA對(duì)象需要同步COM+提供了“activity-based

synchronization”activity:代表單個(gè)客戶執(zhí)行任務(wù)的一組對(duì)象相當(dāng)于一個(gè)邏輯線程每個(gè)activity都包含一個(gè)進(jìn)程范圍內(nèi)的鎖可以處理跨越機(jī)器邊界的嵌套調(diào)用Transaction(事務(wù))分布式應(yīng)用最困難的一個(gè)基礎(chǔ)設(shè)施定義:由一組相互關(guān)聯(lián)的操作構(gòu)成的整體行為難點(diǎn)所在:保持系統(tǒng)狀態(tài)一致性在操作過程中,發(fā)生意外或者失敗操作的中間狀態(tài)要被隔離開組件設(shè)計(jì)思想:把大的操作分解開,并可能包裝到小的組件中。這加劇了事務(wù)的困難,因?yàn)椋涸诰帉懡M件時(shí)需要處理由其他組件引起的所有問題事務(wù)的技術(shù)要點(diǎn)DTC(Distributed

Transaction

Coordinator)每個(gè)組件對(duì)DTC負(fù)責(zé),DTC知道所有的組件兩階段提交準(zhǔn)備和提交對(duì)象表態(tài):committing、abortingCOM+中的事務(wù)COM+runtime提供了免費(fèi)的DTC組件與DTC的通訊IObjectContext::SetCompleteIObjectContext::SetAbortComplete組件的屬性設(shè)置Bank例子事務(wù)與對(duì)象環(huán)境

MoveMoney對(duì)象T1

(事務(wù)根對(duì)象)環(huán)境

AccountA對(duì)象T1

(用戶賬戶)基客戶調(diào)用MoveMoney對(duì)象的Perform方法MoveMoney創(chuàng)建

AccountA對(duì)象環(huán)境

AccountB對(duì)象T1

(電話公司賬戶)(3)MoveMoney創(chuàng)建

AccountB對(duì)象事務(wù)過程環(huán)境

MoveMoney對(duì)象T1

(事務(wù)根對(duì)象)(1)調(diào)用Post環(huán)境

AccountA對(duì)象T1

(用戶賬戶)環(huán)境

AccountB對(duì)象T1

(電話公司賬戶)SQL

ServerCOM+

RMDTC服務(wù)(2)Account對(duì)象通過ADO連接到SQL

Server(3)SQL

Server加入到事務(wù)到T1中(4)Account對(duì)象執(zhí)行

SQL

Server調(diào)用SQL

Server緩沖區(qū)賬戶

用戶賬戶數(shù)目事務(wù)ID¥-100

T1電話公司賬戶¥+100

T1(5)SQL

Server把變化緩存起來COM+

RMCOM+

RM(Resource

Manager)知道當(dāng)參與事務(wù)的對(duì)象改變它的狀態(tài)時(shí),該如何把資源的變化緩存起來如果事務(wù)被提交,RM知道如何改變資源狀態(tài)如果事務(wù)被放棄了,RM知道如何把變化丟掉例如:各種數(shù)據(jù)庫系統(tǒng)、MSMQDTC兩階段提交過程對(duì)象不參與提交過程,只是表態(tài)準(zhǔn)備階段:RM把狀態(tài)信息保存起來,保證不會(huì)失敗提交階段:DTC通過RM提交事務(wù)事務(wù)的特性(ACID)Atomicity要么所有的變化都有效,要么都無效Consistency狀態(tài)一致性Isolation事務(wù)外部看不到事務(wù)的中間結(jié)果Durability緩存的中間結(jié)果要能“持久”COM+事務(wù)的用法(一)COM+事務(wù)的用法(二)COM+事務(wù)的用法(三)[uuid(04CF0B76-1989-11D0-B917-0080C7394688),helpstring("Account

Class"),TRANSACTION_REQUIRED]coclass

CAccount{[default]

interface

IAccount;};[uuid(04CF0B7B-1989-11D0-B917-0080C7394688),helpstring("MoveMoney

Class"),TRANSACTION_REQUIRED]coclass

CMoveMoney{[default]

interface

IMoveMoney;};事務(wù)屬性不支持支持需要需要新建禁用對(duì)象如何控制事務(wù)兩個(gè)控制位transaction-vote

bit:表態(tài)位deactivate-on-return

bit:返回之后,對(duì)象即無效通過環(huán)境對(duì)象控制這兩位IObjectContextIContextStateTransaction

and

Just-In-Time

activation事務(wù)組件必須使用JIT

activation特性基客戶代理RPC通道存根

T1對(duì)象基客戶代理RPC通道存根

(無事務(wù))基客戶代理RPC通道存根

T2新的對(duì)象JIT

activation的意義資源利用——可伸縮性系統(tǒng)幫助回收資源回收的價(jià)值:部分回收所占整體的比例,以及資源本身的重要性(比如數(shù)據(jù)庫連接)保證事務(wù)的正確性一致性和隔離性與對(duì)象池的結(jié)合狀態(tài)管理新概念事務(wù)與對(duì)象池池組件

對(duì)象必須實(shí)現(xiàn)

IObjectControl接口ActivateDeactivateCanBePooled池組件滿足以下條件:線程模型不能為STA可被聚合不能聚合其他的池組件補(bǔ)償資源管理器

(compensating

resource

manager)補(bǔ)償事務(wù)Undo,一個(gè)對(duì)等的反操作缺點(diǎn):破壞隔離性RM之于事務(wù)CRM用到了COM+提供的關(guān)于CRM支持的對(duì)象模型:CRM

Worker要求一個(gè)事務(wù),連接到CRM

ClerkCRM

Clerk負(fù)責(zé)與各方面的通信,包括DTCCRM

compensator完成兩階段提交的工作DTC控制整個(gè)事務(wù)過程隊(duì)列組件(Queued

Components)在分布式系統(tǒng)中,同步、異步并存企業(yè)活動(dòng)中,電話、電子郵件、電話留言通訊雙方在時(shí)間點(diǎn)上的分離例如:在off-line下寫email,然后放到outbox中,一旦on-line,郵件就被發(fā)送出去資源分配更為合理(通過設(shè)置優(yōu)先級(jí)別),從而提高資源利用率和可伸縮能力不必要求所有的應(yīng)用系統(tǒng)都在同一個(gè)時(shí)刻運(yùn)行,從而簡(jiǎn)化分布式應(yīng)用的開發(fā)隊(duì)列組件COM+為這種通訊方式提供了一套基礎(chǔ)設(shè)施QC模型基客戶QC.Recorder異步

MSMQQC.Player對(duì)象MSMQ基礎(chǔ)QC的意義對(duì)于組件透明同樣的組件既可以與Queue結(jié)合,也可以不結(jié)合對(duì)于客戶不完全透明避免了MSMQ編程的復(fù)雜性編寫QC無需任何編寫MQ的經(jīng)驗(yàn)缺點(diǎn):缺少控制能力QC的使用QC的消息隊(duì)列客戶代碼Dim

Ship

As

ObjectSet

Ship

=

GetObject("queue:/new:VBShipProj.VBShip")Ship.CustomerID

=

1111Ship.OrderID

=

2222Ship.LineItem

12,

"Drummers

drumming"Ship.LineItem

11,

"Pipers

piping"Ship.LineItem

10,

"Lords

a

leaping"Ship.LineItem

9,

"Ladies

dancing"Ship.LineItem

8,

"Maids

a

milking"Ship.LineItem

7,

"Swans

a

swimming"Ship.LineItem

6,

"Geese

a

laying"Ship.LineItem

5,

"Gold

rings"

Ship.LineItem

4,

"Calling

birds"Ship.LineItem

3,

"French

hens"Ship.LineItem

2,

"Turtledoves"Ship.LineItem

1,

"A

partridge

in

a

pear

tree"Ship.ProcessQC的設(shè)計(jì)接口設(shè)計(jì)禁止使用[out]、[in,out]、[retval]必須使用按值傳遞參數(shù)方式客戶對(duì)一系列組件方法的調(diào)用必須能夠滿足自己功能的需要,例如,不能使用枚舉器對(duì)象不能返回與應(yīng)用相關(guān)的錯(cuò)誤碼,返回值只表示

QC.Recorder是否記錄成功。如何接收輸出沒有輸出對(duì)某些調(diào)用要求有應(yīng)答用同樣的異步機(jī)制QC傳遞一個(gè)也具有QC特性的回調(diào)對(duì)象在設(shè)計(jì)軟件的時(shí)候應(yīng)該盡量避免輸出的必要性QC的設(shè)計(jì)(續(xù))QC與事務(wù)的結(jié)合MSMQ本身就是一個(gè)RM在客戶端QC與事務(wù)的結(jié)合在服務(wù)器端QC與事務(wù)的結(jié)合QC的安全性與同步方式的認(rèn)證過程不同每個(gè)消息包含數(shù)字簽名QC與Moniker使用Moniker創(chuàng)建QC對(duì)象,例如GetObject(“queue:/new:VBShipProj.VBShip“)–封裝了組件的創(chuàng)建過程,使組件對(duì)于兩種方式透明queue名字對(duì)象GetObject(“queue:ComputerName=SomeMachine/new:VBShipProj.VBShip“)new名字對(duì)象GetObject(“new:VBShipProj.VBShip“)COM+事件模型事件模型中用到的兩個(gè)概念publisher:發(fā)布者subscriber:訂閱者變化通知輪循法可連接對(duì)象——tightly

coupled

eventCOM+的方案:loosely

coupled

event

modelCOM+事件模型結(jié)構(gòu)COM+目錄事件類訂閱信息表Publisher1注冊(cè)Subscriber2注冊(cè)事件對(duì)象IFooe1(…)e2(…)...3創(chuàng)建4激發(fā)5讀入subscriber列表...IFoo6把事件遞e1(…)交到每個(gè)e2(…)subscriber7接收事件安裝新的事件類Subscriber創(chuàng)建一個(gè)subscriptionPublisher示例代碼"

Create

the

event

class

objectDim

foo

As

New

StockEventCls"

Call

the

event

class

object"s

method

that"

fires

the

StockPriceChanged

event.Private

Sub

Command1_Click()Call

foo.StockPriceChanged(Text1.Text,

CCur(Text2.Text))End

Sub"

Call

the

event

class

object"s

method

that"

fires

the

NewStockListed

event.Private

Sub

Command2_Click()Call

foo.NewStockListed(Text1.Text)End

SubSubscriber示例代碼"

The

subscriber

must

implement

the

interface

on"

which

it

wants

to

receive

calls

from

the

event

objectImplements

StockEventCls"

Pop

up

message

box

telling

user

of"

NewStockListed

eventPrivate

Sub

StockEventCls_NewStockListed(ByVal

Symbol

As

String)MsgBox

"New

Stock

"

+

Symbol

+

"

has

started

trading",

vbOKOnly,

_"VB

Event

Subscriber"End

Sub"

Pop

up

message

box

telling

user

of"

StockPriceChanged

eventPrivate

Sub

StockEventCls_StockPriceChanged(ByVal

Symbol

As

String,

_ByVal

Price

As

Currency)MsgBox

"The

market

price

of

stock

"

+

Symbol

+

"

is

now

_+

Str(Price),

vbOKOnly,

"VB

Event

Subscriber"End

Subsubscription兩種形式persistenttransientSet

oCOMAdminCatalog

=

CreateObject("COMAdmin.COMAdminCatalog.1")"Get

the

TRANSIENTSUBscriptIONS

collectionSet

oTSCol

=

oCOMAdminCatalog.GetCollection("TransientSubscriptions")Set

oSubscription

=

oTSCol.AddSet

objvar

=

objrefoSubscription.Value("SubscriberInterface")

=

objrefoSubscription.Value("EventCLSID")

=

clsidoSubscription.Value("Name")

=

"TransientSubscription"oTSCol.SaveChanges關(guān)于事件事件方法調(diào)用返回對(duì)于非QC組件,表明事件方法已經(jīng)被調(diào)用對(duì)于QC組件,表明事件調(diào)用已經(jīng)被送到隊(duì)列中返回值僅表明該事件提交的大致

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論