Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
REST API 出現(xiàn)之前,SOAP (Simple Object Access Protocol) 一直都是基于 web 的標(biāo)準(zhǔn)協(xié)議,雖然現(xiàn)在 REST 大行其道,但在平時開發(fā)中總會遇到對接第三方服務(wù)采用的是基于SOAP協(xié)議的場景,在這篇文章中,我們將會討論如何在 ASP.Net Core 中對接 WCF。
WCF 是一個安全可靠的消息平臺,它提供統(tǒng)一的編程模型便于開發(fā)基于面向服務(wù)的應(yīng)用程序,你可以使用 WCF 構(gòu)建基于 SOAP 協(xié)議的服務(wù),并使用 xml 作為數(shù)據(jù)交換格式,或者基于 REST 的 json 數(shù)據(jù)交換格式。
這一節(jié)中首先創(chuàng)建一個 WCF SOAP 服務(wù),在創(chuàng)建項目模板的時候選擇 WCF Service Application
即可,如下圖所示:
值得注意的是,WCF 通常由以下幾個部分組成。
Service 類
Service 契約
Operation 契約
Endpoints 端點
Hosting 環(huán)境
當(dāng)要使用 WCF,需要在類和方法上分別加上:ServiceContract
和 OperationContract
,下面的代碼展示了一個契約類僅包含一個契約方法的代碼定義。
[ServiceContract]
public interface IAuthorService
{
[OperationContract]
List<string> GetAuthorNames();
}
接下來定義一個 AuthorService
服務(wù)類實現(xiàn)一下 IAuthorService 接口,下面的代碼展示了 AuthorService 類的具體定義。
public class AuthorService : IAuthorService
{
public List<string> GetAuthorNames()
{
List<string> lstAuthors=new List<string>();
lstAuthors.Add("Joydip Kanjilal");
lstAuthors.Add("Steve Smith");
lstAuthors.Add("Michael Stevens");
return lstAuthors;
}
}
這就是構(gòu)建 WCF 服務(wù)的所有步驟,接下來就可以打開瀏覽器對服務(wù)進(jìn)行簡單測試了。
與傳統(tǒng)的 ASP.NET 不同,ASP.Net Core 中并沒有 Add Service Reference
選項去添加對 WCF 服務(wù)地址的引用,新的操作方式需要利用 Microsoft WCF Web Service Reference Provider
來進(jìn)行服務(wù)引用,如下圖所示:
當(dāng)點擊圖中的 Finish 之后,VS會自動幫你完成一系列的初始化,比如從SOAP服務(wù)中下載元數(shù)據(jù),生成客戶端的代理代碼,自動生成 Reference.cs
文件,等等。
好了,接下來可以在 Controller 中初始化 SOAP Service ,然后再調(diào)用 Service 端的 GetAuthorNamesAsync() 方法,如下代碼所示:
[HttpGet]
public async Task<string[]> Get()
{
ServiceReference1.AuthorServiceClient authorServiceClient=new ServiceReference1.AuthorServiceClient();
var data=await authorServiceClient.GetAuthorNamesAsync();
return data;
}
WCF Connected Service 是 Visual Studio 的一個擴(kuò)展插件,它允許在 ASP.Net Core 項目中實現(xiàn)對 WCF 服務(wù)的引用,當(dāng)然,除了WCF還可以引用 Azure Storage
服務(wù),關(guān)于 Azure Storage 的更多細(xì)節(jié),我會在后面的文章中和大家細(xì)聊。
譯文鏈接:https://www.infoworld.com/article/3323584/how-to-consume-a-wcf-soap-service-in-aspnet-core.html
軟件架構(gòu)邏輯
框架從層次結(jié)構(gòu)上分主要分為:表示層、服務(wù)層、業(yè)務(wù)層、數(shù)據(jù)層
◆表示層
表示層由UI(User Interface)和UI控制邏輯組成。
c/s選用wpf+智能客戶端,b/s選用asp.net mvc
WPF的出現(xiàn)解決了三個問題:
(1) 更快速的去開發(fā)更豐富的用戶體驗:使用WPF,可以在更加快速的時間內(nèi)開發(fā)出來更加豐富的界面,滿足用戶的需求。WPF 借助 XAML 來利用標(biāo)記而不是編程語言(如 C#)來構(gòu)造精美逼真的用戶界面 (UI), 只要稍微具備一些HTML基礎(chǔ)知識,就可以快速地掌握XAML中的大部分內(nèi)容。
(2) 消除用戶界面差異:wpf可以以IE為宿主的。或Silverlight
(3) 軟件開發(fā)團(tuán)隊的協(xié)作問題: 在軟件團(tuán)隊中,我們比較熟悉Developer、DBA、Tester、IT Pro、Architect等。Designer可能往往被我們忽視,但實際上,Designer的工作成果才是與客戶距離最近的。而且Designer與Developer如何配合工作,是很多團(tuán)隊所頭疼的,而WPF正可以解決此問題。
智能客戶端的優(yōu)勢
1)充分利用終端設(shè)備的優(yōu)勢
2)能夠調(diào)用wcf
3)支持在線和離線兩種狀態(tài)
4)能夠如同Web應(yīng)用程序一般簡單方便的部署
asp.net mvc內(nèi)置AJAX支持。
本身含的MVC(模型-視圖-控制器)和本系統(tǒng)MVVM(Model-View-ViewModel)就是雙胞胎,在demo里已經(jīng)有很好的集成
*注:因xaml和html是標(biāo)記語言,此層大部分可用代碼生成器生成。
◆服務(wù)層
采用微軟的WCF,Windows Communication Foundation (WCF)是Microsoft為構(gòu)建面向服務(wù)的應(yīng)用提供的分布式通信編程框架平臺,是.NET Framework 3.5的重要組成部分。使用該框架,開發(fā)人員可以構(gòu)建跨平臺、安全、可靠和支持事務(wù)處理的企業(yè)級互聯(lián)應(yīng)用解決方案。WCF從一開始就是工程化的,能夠簡化應(yīng)用程序的開發(fā)與部署,降低開發(fā)成本。用于構(gòu)建面向服務(wù)的應(yīng)用程序,不管這些程序是獨(dú)立的桌面應(yīng)用程序,還是Web應(yīng)用程序和服務(wù),還是高端的企業(yè)應(yīng)用程序。
◆邏輯、業(yè)務(wù)層
業(yè)務(wù)層封裝了實際業(yè)務(wù)邏輯,包含數(shù)據(jù)驗證,事物處理,權(quán)限處理等業(yè)務(wù)相關(guān)操作,是整個應(yīng)用系統(tǒng)的核心。因此設(shè)計一個能夠真實反映實際需要的業(yè)務(wù)層是非常必要的,我們將實際業(yè)務(wù)具體分為業(yè)務(wù)數(shù)據(jù)與業(yè)務(wù)操作兩部分。
l 業(yè)務(wù)數(shù)據(jù)
Domain Model則是根據(jù)實際業(yè)務(wù)按照現(xiàn)實方式用OO思想建模,這樣很適合業(yè)務(wù)復(fù)雜的系統(tǒng)。通常采用自定義數(shù)據(jù)實體(Custom Data Entity)方式表達(dá)。自定義數(shù)據(jù)實體,有著良好的性能,編譯時的類型檢查,數(shù)據(jù)表現(xiàn)方式非常直觀符合實際業(yè)務(wù)的操作方式等優(yōu)點,但需要自己定義維護(hù)類,在分布式環(huán)境下需要自己編寫序列化方法。
此階段負(fù)責(zé)數(shù)據(jù)交換(傳輸)的業(yè)務(wù)實體被稱之為DTO(Data Transfer Object)。
DTO要能夠支持:數(shù)據(jù)綁定、數(shù)據(jù)驗證、歷史記錄、級聯(lián)觸發(fā)、合并集合、序列化與反序列化,要實現(xiàn)一個大的遞歸,從其中的任何一個對象開始,能夠找出整個傳遞的所有數(shù)據(jù)。
(1)、數(shù)據(jù)的綁定支持。要實現(xiàn)IEditableObject接口,對于狀態(tài)的變化要實現(xiàn)INotifyPropertyChanged接口,這樣才能夠?qū)崿F(xiàn)數(shù)據(jù)的觸發(fā),這樣就要實現(xiàn)一個對象能夠找到其所有的集合,一個集合要能夠其所有的對象,這樣一樣,就必須實現(xiàn)從對象、集合、對象的遞歸,再深入一點,就實現(xiàn)了數(shù)據(jù)的級聯(lián)觸發(fā),實現(xiàn)了雙向數(shù)據(jù)觸發(fā)、綁定。數(shù)據(jù)源的每個屬性變更,要能夠在界面上反映出來,綁定界面的改變,能夠記錄到后臺的數(shù)據(jù)源,并且要能夠支持回滾。對于容納這些數(shù)據(jù)的ObservableCollection集合也支持綁定處理。
(2)、數(shù)據(jù)驗證。實現(xiàn)IDataErrorInfo接口
(3) 對于歷史記錄。當(dāng)實現(xiàn)IEditableObject這個接口,則必然實現(xiàn)了歷史記錄。能夠找到集合的所有更改的記錄,包括刪除的記錄。對于單個對象而言是能夠得到歷史記錄和當(dāng)前數(shù)據(jù),對于集合而言,則能夠找出差異集,同時,集合也要具備集合回滾的功能。
(4) 級聯(lián)觸發(fā),則是在實現(xiàn)數(shù)據(jù)綁定的基礎(chǔ)上的,對于常見的主從結(jié)構(gòu),當(dāng)從對象的一個屬性改變了,要能夠自動通知其所在的集合、集合再通知所在的對象數(shù)據(jù)改變了,如果是多層結(jié)構(gòu),則能夠自動的從最底層開始一路通知到頂層。
(5)合并集合、集合的處理。集合的處理與數(shù)據(jù)綁定是直接相當(dāng)?shù)摹?shù)據(jù)源找出差異集之后,要對差異集進(jìn)行處理,處理完之后,要對原始集合進(jìn)行更進(jìn)一步的處理,要把兩個集合進(jìn)行合并處理,主要是為了同步引用。
(6)同時,另外要實現(xiàn)的就是Data與SDO之間的轉(zhuǎn)換以及其他格式的數(shù)據(jù)與SDO、Data數(shù)據(jù)之間的數(shù)據(jù)轉(zhuǎn)換,比如Binary/Xml/Text/Key/文件/等,最基本的是SDO與Data之間的轉(zhuǎn)換,這些轉(zhuǎn)換根據(jù)需要,有時候是單向的,有時候是雙向的,根據(jù)業(yè)務(wù)需求而定。
(7)序列化與反序列化,主要是涉及到Binary和XML序列化。
l 業(yè)務(wù)操作
業(yè)務(wù)操作負(fù)責(zé)對業(yè)務(wù)數(shù)據(jù)進(jìn)行各種業(yè)務(wù)相關(guān)的處理,例如驗證,流向,整合,事物,權(quán)限等,但它不負(fù)責(zé)有關(guān)對數(shù)據(jù)源的操作。
采用整合業(yè)務(wù)數(shù)據(jù)與業(yè)務(wù)方式來操作,將業(yè)務(wù)數(shù)據(jù)與相關(guān)的業(yè)務(wù)操作封裝在一起稱為業(yè)務(wù)實體,業(yè)務(wù)實體作為統(tǒng)一的業(yè)務(wù)層為表示層提供服務(wù),同時也負(fù)責(zé)作為DTO在各個層次間傳輸,這樣完整的Domain Model設(shè)計方式,每個業(yè)務(wù)實體都可以做為一個單獨(dú)組件形式存在,對于組件化復(fù)用有著莫大的好處。
◆數(shù)據(jù)層
數(shù)據(jù)層的宗旨就是為數(shù)據(jù)源提供一個可供外界訪問的接口,我們應(yīng)該選用一種能夠提供數(shù)據(jù)源無關(guān)的抽象數(shù)據(jù)訪問接口并通過在其下掛接各種不同的DataProviador來訪問數(shù)據(jù)源的數(shù)據(jù)層組件,這樣做便于移植到不同的數(shù)據(jù)源上。
從紛繁蕪雜的關(guān)系數(shù)據(jù)模型中抽象出概念模型。這樣開發(fā)人員可以只需著眼概念模型,而不必要去關(guān)心紛繁蕪雜的關(guān)系數(shù)據(jù)模型,從而提高開發(fā)效率。那么如何能夠做到這一點?
答案就是:Linq 和 ADO.NET Entity Framework
l LINQ幾乎支持你所期望的所有數(shù)據(jù)源:數(shù)據(jù)對象、SQL Server數(shù)據(jù)庫、XML和數(shù)據(jù)集,當(dāng)然也支持ADO.NET Entity(LINQ to Entities),LINQ有如下優(yōu)勢:
1、 無需復(fù)雜學(xué)習(xí)過程即可上手
下面我給出一個簡單的C#示例。
String[] QueryString=
{ "One", "Two", "Three", "Four", "Five" };
要想查找其中長度大于3的字符串,你可以使用以下查詢語句:
var ThisQuery=
from StringValue
in QueryString
where StringValue.Length > 3
select StringValue;
2、 編寫更少代碼即可創(chuàng)建完整應(yīng)用。
3、 更快開發(fā)錯誤更少的應(yīng)用程序。
4、 無需求助奇怪的編程技巧就可合并數(shù)據(jù)源。
5、 讓新開發(fā)者開發(fā)效率更高。
l ADO.NET Entity Framework包括
1. 實體數(shù)據(jù)模型(Entity Data Model),開發(fā)人員通過EDM抽象出非常合適的模型。
2. 非常強(qiáng)大的client-view/mappping引擎,用于映射數(shù)據(jù)關(guān)系
3. Entity SQL語言和LINQ查詢對EDM schemas的全面支持
4. ojbect services layer供您選擇以何種方式去處理查詢結(jié)果。比如(行,列或作為對象)。
5. 提供一個開放的模型使ADO.NET Entity Framework可以處理其他的數(shù)據(jù)存儲。
6. Entity Framework 實現(xiàn)了樂觀的并發(fā)模式(Optimistic Concurrency Model)
7. 事務(wù)處理
三、具體功能簡述
3.1工作流解決方案
工作流引擎:該部分為工作流模型的核心部分,用于生成、管理、角度和監(jiān)控工作流的各個活動執(zhí)行情況,并實現(xiàn)相應(yīng)的人機(jī)交互。由于采用XPDL等語言定義的工作流文件記載了相應(yīng)的業(yè)務(wù)邏輯,隱藏工作流引擎通過解析該文件來了解業(yè)務(wù)流轉(zhuǎn)的邏輯。然后依據(jù)某種運(yùn)行模式按照解析出來的業(yè)務(wù)邏輯進(jìn)行驅(qū)動,最終實現(xiàn)業(yè)務(wù)流程的流轉(zhuǎn)。
工作流定義接口:通過該接口可以進(jìn)行工作流程的分析、建模、描述和歸檔等工作,并將設(shè)計完畢的業(yè)務(wù)流程生成工作流引擎能夠識別的語言。
工作流客戶接口:處理工作流運(yùn)行過程中需要人為參與的操作。
工作流調(diào)用應(yīng)用程序接口:工作流引擎調(diào)用外部應(yīng)用程序的規(guī)范。
工作流引擎協(xié)作接口:不同工作流引擎之間的協(xié)作。
工作流管理監(jiān)控接口:監(jiān)控和管理工作流所有實例狀態(tài)。
3.2多語言&用戶自定義標(biāo)簽方案
數(shù)據(jù)庫結(jié)構(gòu)
3.3消息發(fā)布/訂閱系統(tǒng)方案
使用WCF創(chuàng)建發(fā)布/訂閱系統(tǒng)有多種不同的方式,
(1)使用回調(diào)契約的發(fā)布/訂閱系統(tǒng)
(2)使用MSMQ實際通用組播的發(fā)布/訂閱系統(tǒng)
(3)使用流的發(fā)布/訂閱系統(tǒng)
方法1,2適合通知數(shù)據(jù)量較大并且發(fā)布頻率比較低的應(yīng)用場景。
當(dāng)通知的數(shù)據(jù)量較小而且發(fā)布頻率又較高時,應(yīng)該使用方法3。
3.4報表&打印方案
四、系統(tǒng)平臺&支撐組件
l Wpf (UI)
l Asp.net mvc(UI)
l ClickOnce(智能客戶端。可自動升級,離線操作)
l Linq(借助于LINQ技術(shù),我們可以使用一種類似SQL的語法來查詢?nèi)魏涡问降臄?shù)據(jù),普通開發(fā)人員不必學(xué)習(xí)MsSql, mysql, orcale, access等數(shù)據(jù)庫語法,節(jié)省開發(fā)時間)
l ADO.NET Entity(讓應(yīng)用程序可以用完全對象化的方法連接與訪問數(shù)據(jù)庫, 修改Provider就可遷移到不同的數(shù)據(jù)庫)
l IIS6或以上
l Windows server 2003或以上
l WCF(服務(wù)層)
l Unity(是微軟模式與實踐團(tuán)隊開發(fā)的一個輕量級、可擴(kuò)展的依賴注入&反轉(zhuǎn)控制容器)
l SQL Server Compact Edition(用作智能客戶端離線操作)
l WF(Microsoft Windows Workflow Foundation是一個可擴(kuò)展框架,用于在 Windows 平臺上開發(fā)工作流解決方案)
五、系統(tǒng)網(wǎng)絡(luò)結(jié)構(gòu)
SOA(service-oriented architecture,也叫面向服務(wù)的體系結(jié)構(gòu)或面向服務(wù)架構(gòu))是指為了解決在Internet環(huán)境下業(yè)務(wù)集成的需要,通過連接能完成特定任務(wù)的獨(dú)立功能實體實現(xiàn)的一種軟件系統(tǒng)架構(gòu)。SOA是一個組件模型,它將應(yīng)用程序的不同功能單元(稱為服務(wù))通過這些服務(wù)之間定義良好的接口和契約聯(lián)系起來。接口是采用中立的方式進(jìn)行定義的,它應(yīng)該獨(dú)立于實現(xiàn)服務(wù)的硬件平臺、操作系統(tǒng)和編程語言。這使得構(gòu)建在各種這樣的系統(tǒng)中的服務(wù)可以以一種統(tǒng)一和通用的方式進(jìn)行交互。
傳統(tǒng)的Web(HTML/HTTP)技術(shù)有效的解決了人與信息系統(tǒng)的交互和溝通問題,極大地促進(jìn)了B2C模式的發(fā)展。WEB服務(wù)(XML/SOAP/WSDL)技術(shù)則是要有效的解決信息系統(tǒng)之間的交互和溝通問題,促進(jìn)B2B/EAI/CB2C的發(fā)展。SOA(面向服務(wù)的體系)則是采用面向服務(wù)的商業(yè)建模技術(shù)和WEB服務(wù)技術(shù),實現(xiàn)系統(tǒng)之間的松耦合,實現(xiàn)系統(tǒng)之間的整合與協(xié)同。WEB服務(wù)和SOA的本質(zhì)思路在于使得信息系統(tǒng)個體在能夠溝通的基礎(chǔ)上形成協(xié)同工作。
對于面向同步和異步應(yīng)用的,基于請求/響應(yīng)模式的分布式計算來說,SOA是一場革命。一個應(yīng)用程序的業(yè)務(wù)邏輯(business logic)或某些單獨(dú)的功能被模塊化并作為服務(wù)呈現(xiàn)給消費(fèi)者或客戶端。這些服務(wù)的關(guān)鍵是他們的松耦合特性。例如,服務(wù)的接口和實現(xiàn)相獨(dú)立。應(yīng)用開發(fā)人員或者系統(tǒng)集成者可以通過組合一個或多個服務(wù)來構(gòu)建應(yīng)用,而無須理解服務(wù)的底層實現(xiàn)。舉例來說,一個服務(wù)可以用。NET或J2EE來實現(xiàn),而使用該服務(wù)的應(yīng)用程序可以在不同的平臺之上,使用的語言也可以不同。
SOA的實施具有幾個鮮明的基本特征。實施SOA的關(guān)鍵目標(biāo)是實現(xiàn)企業(yè)IT資產(chǎn)的最大化作用。要實現(xiàn)這一目標(biāo),就要在實施SOA的過程中牢記以下特征:
不同種類的操作系統(tǒng),應(yīng)用軟件,系統(tǒng)軟件和應(yīng)用基礎(chǔ)結(jié)構(gòu)(application infrastructure)相互交織,這便是IT企業(yè)的現(xiàn)狀。一些現(xiàn)存的應(yīng)用程序被用來處理當(dāng)前的業(yè)務(wù)流程(business processes),因此從頭建立一個新的基礎(chǔ)環(huán)境是不可能的。企業(yè)應(yīng)該能對業(yè)務(wù)的變化做出快速的反應(yīng),利用對現(xiàn)有的應(yīng)用程序和應(yīng)用基礎(chǔ)結(jié)構(gòu)(application infrastructure)的投資來解決新的業(yè)務(wù)需求,為客戶,商業(yè)伙伴以及供應(yīng)商提供新的互動渠道,并呈現(xiàn)一個可以支持有機(jī)業(yè)務(wù)(organic business)的構(gòu)架。SOA憑借其松耦合的特性,使得企業(yè)可以按照模塊化的方式來添加新服務(wù)或更新現(xiàn)有服務(wù),以解決新的業(yè)務(wù)需要,提供選擇從而可以通過不同的渠道提供服務(wù),并可以把企業(yè)現(xiàn)有的或已有的應(yīng)用作為服務(wù), 從而保護(hù)了現(xiàn)有的IT基礎(chǔ)建設(shè)投資。
關(guān)于SOA平臺服務(wù)的定義,目前來說一般有兩種形式,一種是定義標(biāo)準(zhǔn)接口的形式,一種是以標(biāo)準(zhǔn)的WebService的形式來下定義服務(wù)的實現(xiàn)。
在上圖中是以接口的形式來定義SOA平臺服務(wù)的,RDIFramework.NET的SOA實現(xiàn)也是采用這種方式。具體的實現(xiàn)是以.NET技術(shù)的WCF來實現(xiàn)的,服務(wù)可以以以下幾種方式寄存(發(fā)布):Windows服務(wù)模式(常用)、WinForm界面模式、IIS服務(wù)模式等等。在后面的文章我們會分別介紹。
一、SOA要求一致性
有很多可用于創(chuàng)建、發(fā)布、發(fā)現(xiàn)和調(diào)用服務(wù)的候選技術(shù)。SOA 應(yīng)提供一個參考體系結(jié)構(gòu),以指定服務(wù)提供者和使用者將使用的特定機(jī)制;我們應(yīng)以在 SAO 所有參與者間實現(xiàn)一致性為目標(biāo)。此類一致性可以減少開發(fā)、集成和維護(hù)工作。
如果需要使用參考體系結(jié)構(gòu)之外的元素,我們推薦使用補(bǔ)充性方法。例如,假如我們?yōu)榉?wù)發(fā)布和發(fā)現(xiàn)選擇的機(jī)制是 UDDI,但某個特定的開發(fā)團(tuán)隊已在使用一個基于其他存儲庫技術(shù)的開發(fā)流程,此時該如何處理呢?我們將選擇投入精力將該團(tuán)隊的服務(wù)同時發(fā)布到兩個存儲庫。這樣,現(xiàn)有的服務(wù)使用者就可以使用其熟悉(但可能并不標(biāo)準(zhǔn))的存儲庫了。而運(yùn)行于公共 SOA 基礎(chǔ)結(jié)構(gòu)上的使用者則可以為所有服務(wù)使用標(biāo)準(zhǔn)存儲庫——例如 UDDI。
二、SOA 簡化開發(fā)
我們希望任何企業(yè)級的 SOA 基礎(chǔ)結(jié)構(gòu)都具有可伸縮性和彈性;還應(yīng)包含行業(yè)級的企業(yè)服務(wù)總線(Enterprise Service Bus,ESB)和安全技術(shù)。或者,換種說法,以 SOA 為目標(biāo)的服務(wù)和流程的開發(fā)人員可利用成熟的中間件,依賴 SOA 基礎(chǔ)結(jié)構(gòu)提供問題的解決方案,如身份驗證、消息轉(zhuǎn)換和可靠消息交付。
這些中間件功能的提供應(yīng)以一個重要的原則為基礎(chǔ):服務(wù)和流程開發(fā)人員應(yīng)遠(yuǎn)離中間件實現(xiàn)的復(fù)雜細(xì)節(jié)。我們的理想目標(biāo)是,在我們的 SOA 環(huán)境中工作的開發(fā)人員應(yīng)只需要業(yè)務(wù)領(lǐng)域的相關(guān)知識和基本的編程技巧。
服務(wù)具有標(biāo)準(zhǔn)的、經(jīng)過正式定義的可由計算機(jī)處理的接口
了解了工具和代碼生成在 SOA 實現(xiàn)中可扮演重要角色之后,我們現(xiàn)在要強(qiáng)調(diào)使用可由計算機(jī)處理的接口的重要性。當(dāng)使用定義良好的可由計算機(jī)處理的語言描述了接口時,實際上就為各種工具支持功能提供了支持。我們希望改善分離狀況,因此我們強(qiáng)烈建議使用 WSDL 之類正式定義的開放標(biāo)準(zhǔn)語言,而不要使用專用格式。
可由計算機(jī)處理的方法的概念應(yīng)該從服務(wù)接口描述(如 WSDL)擴(kuò)展到所有其他形式的聲明信息或元數(shù)據(jù)。只有同時強(qiáng)調(diào)聲明技術(shù)和可由計算機(jī)處理的元數(shù)據(jù),才能將其相關(guān)的復(fù)雜性從業(yè)務(wù)應(yīng)用程序開發(fā)人員轉(zhuǎn)移到基于標(biāo)準(zhǔn)的中間件中。新興的 WS-Policy 之類的技術(shù)在支持此方法方面充當(dāng)著重要的角色。
三、服務(wù)應(yīng)設(shè)計為可重用
服務(wù)設(shè)計人員應(yīng)該記住,他們所開發(fā)的任何服務(wù)都可能成為可重用資產(chǎn)。設(shè)計人員不應(yīng)只關(guān)注服務(wù)的最初使用者的需求,而應(yīng)該進(jìn)行更為廣泛的業(yè)務(wù)分析,以確定更全面的需求。我們建議,設(shè)計人員應(yīng)考慮服務(wù)可能的發(fā)展方向:
設(shè)計必須能適應(yīng)不斷增加的吞吐量;如果服務(wù)在使用服務(wù)的數(shù)量增加的情況下仍可成功運(yùn)行,那么使用率也會成級數(shù)遞增。
如果使用服務(wù)的數(shù)量增加,則數(shù)據(jù)量和并發(fā)數(shù)據(jù)訪問模式可能會與最初投入使用時的情況大為不同。
我們必須對服務(wù)請求的未來增長進(jìn)行預(yù)計;新使用者可能需要其他的功能,或者需要對現(xiàn)有功能進(jìn)行更改
四、服務(wù)應(yīng)具有精心選擇的粒度
在選擇服務(wù)粒度時,我們可能需要在多個因素間進(jìn)行折衷,如可維護(hù)性、可操作性和易用性。任何給定的 SOA 都應(yīng)向服務(wù)設(shè)計人員提供指南,以便確定此類折衷方案。
五、服務(wù)應(yīng)是內(nèi)聚而完整的
既然認(rèn)識到了在確定服務(wù)粒度時需要考慮周全,那么在確定哪些操作應(yīng)組成服務(wù)時有什么注意事項呢?我們認(rèn)為有兩個對象設(shè)計概念很有用:內(nèi)聚性和完整性。
六、服務(wù)應(yīng)對實現(xiàn)細(xì)節(jié)進(jìn)行封裝
我們封裝服務(wù)實現(xiàn)的細(xì)節(jié)——所用的算法和資源——的動機(jī)在于增加服務(wù)使用者和提供者之間的分離,從而為將來擴(kuò)展提供靈活性。
七、操作設(shè)計應(yīng)考慮并發(fā)性
RDIFramework.NET框架的SOA(WCF服務(wù)端)可以通過以下幾種方式進(jìn)行寄存(發(fā)布): 以Windows服務(wù)方式寄存,以WinForm形式寄存和以IIS形式寄存。
要想框架以WCF模式運(yùn)行,首先必須配置RDIFramework.NET框架可運(yùn)行文件所在文件夾的“Config.xml”文件,找到“軟件服務(wù)提供程序”項,其取值有兩種:RDIFramework.ServiceAdapter與RDIFramework.ServiceClient
系統(tǒng)默認(rèn)為“RDIFramework.ServiceAdapter”,即傳統(tǒng)數(shù)據(jù)訪問方式(邏輯上的三層結(jié)構(gòu)),要想系統(tǒng)以WCF模式運(yùn)行,必須設(shè)置其值為:RDIFramework.ServiceClient
通過這樣的設(shè)置,再簡單部署一下,即可以SOA模式運(yùn)行本程序。SOA模式運(yùn)行Config.xml文件配置如下圖所示。
當(dāng)然了,對于SOA模式的客戶端與服務(wù)端的正確配置以及綁定的方法,可以參考相關(guān)文章,在我們框架的配置文件中也進(jìn)行了詳細(xì)的說明。
要想我們的框架以Windows服務(wù)寄存,必須部署框架的WCF服務(wù)“RDIFramework.WinService”目錄包含的內(nèi)容即為我們的框架以Windows服務(wù)進(jìn)行寄存所必須的文件,如圖7.3.1所示。圖中含有兩個批處理文件可以很好的幫助我們安裝與卸載框架的Windows服務(wù),他們分別是:
Install RDIFrameworkService.bat:用于安裝框架的WCF服務(wù)以寄存到Windows服務(wù)上。
Uninstall RDIFrameworkService.bat:用于卸載已經(jīng)安裝好框架WCF服務(wù)。
如下圖:RDIFramework.NET以Windows服務(wù)進(jìn)行寄存所需文件所示。
雙擊Install RDIFrameworkService.bat文件進(jìn)行服務(wù)的安裝,如圖7.3.2所示,輸入:y,即可對服務(wù)進(jìn)行安裝。如下圖所示:
安裝成功會出現(xiàn)下圖所示的字樣。
到Windows服務(wù)管理器中,可以看到我們框架的服務(wù)已經(jīng)安裝成功,首次安裝成功默認(rèn)沒有啟動,就請手動啟動即可,如下圖所示。
對于安裝成功的服務(wù),我們也可以對他進(jìn)行卸載,卸載服務(wù)使用Uninstall RDIFrameworkService.bat文件,雙擊此文件,輸入”y”即可對已成功安裝的框架服務(wù)進(jìn)行卸載,如下圖所示。
或者用InstallUtil.exe命令卸載框架服務(wù)也可以,如下圖所示:
框架以SOA模式運(yùn)行的效果如下圖所示,可以看到其與傳統(tǒng)的方式運(yùn)行效果完全一樣。
因為我們開啟了WCF的日志功能,我們可以通過VS2010自帶的“服務(wù)跟蹤查看器”查看WCF的調(diào)用過程,當(dāng)然建議在系統(tǒng)投入正常使用后,關(guān)閉WCF的日志記錄功能,以免影響整個框架的效率,在此僅做測試使用,要打開VS的服務(wù)跟蹤查看器,到開始菜單VS的安裝菜單名下,找到“服務(wù)跟蹤查看器”,即可打開,如下圖所示。
通過“服務(wù)跟蹤查看器”我們可以很清楚地看到我們框架是如何調(diào)用WCF服務(wù)的,整個過程都詳細(xì)的進(jìn)行了記錄,如下圖所示。對于“服務(wù)跟蹤查看器”的使用方法可以參考相關(guān)文檔,也可以查看其自帶的幫助文件。
以上就是我們框架的分布式架構(gòu)部署方案(以Windows服務(wù)為寄存宿主)。
我們的框架不僅可以寄存在Windows服務(wù)程序中,還可以以WinForm形式寄存,使用方式與Windows服務(wù)寄存類似。以Winform形式寄存意思是說,服務(wù)端以窗體界面形式來啟動,這種方式比較簡單易懂,用戶可以把啟動框架服務(wù)的窗體主程序放在Windows自啟動菜單,讓開機(jī)時自動啟動我們的框架服務(wù)。RDIFramework.NET服務(wù)端以WinForm形式寄存運(yùn)行目錄:Bin\FrameworkService\RDIFramework.ServiceHost.exe即可,開啟后的效果如下圖所示:
服務(wù)端已經(jīng)開啟,現(xiàn)在運(yùn)行RDIFrmework.NET客戶端,效果與Windows服務(wù)方式一至。要測試我們啟動的服務(wù),我們可以使用“WCF測試客戶端”來進(jìn)行測試。wcftestclient.exe是一個GUI的工具用于測試WCF,只需在Visual studio command line 窗口中鍵入wcftestclient,就啟動這個程序。如下圖:
可以右鍵“我的服務(wù)項目”選擇“添加服務(wù)(A)…”來添加WCF服務(wù),在上圖中,我們輸入“net.tcp://127.0.0.1:8888/RDIFramework.ServiceAdapter/UserService/mex”添加了對用戶服務(wù)的測試調(diào)用。
我們的框架不僅可以Windows服務(wù)、WinForm界面形式寄存,還可以使用IIS的Web服務(wù)形式來寄存。
要以IIS方式來寄存框架的WCF服務(wù),首先我們需要把“RDIFramework.WCFService”項目發(fā)布到IIS下,發(fā)布的方法與常規(guī)的Web發(fā)布方式一樣,可以參照相關(guān)的文章,RDIFramework.WCFService項目如下圖所示:
發(fā)布到IIS后的效果如下圖所示:
在這兒需要說明的是,框架的服務(wù)發(fā)布到IIS下后,對應(yīng)的應(yīng)用程序池的.NET Framework版本要選擇.NET Framework V4.0以上版本。如下圖所示:
至此,我們可以用瀏覽器來瀏覽我們發(fā)布的服務(wù),測試發(fā)布的服務(wù)是否成功,如下圖所示,我們測試StaffService服務(wù)。
我們也可以用“WCF測試客戶端”來測試我們發(fā)布到IIS下的WCF服務(wù),如下圖所示:
以上面三種方式發(fā)布SOA服務(wù)端,來進(jìn)行分布式應(yīng)用的部署,都可以成功運(yùn)行我們框架的客戶端,用戶在使用過程中,可以根據(jù)實際情況做出自己的選擇。
全新跨平臺版本.NET敏捷開發(fā)框架V5.0-RDIFramework.NET震撼發(fā)布
敏捷開發(fā)框架助力企業(yè)BPM業(yè)務(wù)流程系統(tǒng)的開發(fā)與落地
RDIFramework.NET代碼生成器全新V5.0版發(fā)布
一路走來數(shù)個年頭,感謝RDIFramework.NET框架的支持者與使用者,大家可以通過下面的地址了解詳情。
RDIFramework.NET官方網(wǎng)站:http://www.rdiframework.net/
RDIFramework.NET官方博客:http://blog.rdiframework.net/
特別說明,框架相關(guān)的技術(shù)文章請以官方網(wǎng)站為準(zhǔn),歡迎大家收藏!
RDIFramework.NET框架由海南國思軟件科技有限公司專業(yè)團(tuán)隊長期打造、一直在更新、一直在升級,請放心使用!
歡迎關(guān)注RDIFramework.NET框架官方微信公眾號(微信號:guosisoft),及時了解最新動態(tài)。
*請認(rèn)真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。