服務層框架設計(一)——簡要介紹

辛酸與幸福的故事,讓我最近心如止水,越來越平靜,越來越執着於我們的未來,越來越自信於自己的事業。

從今天開始,我每天會整理自己的文檔,把自己的思路和架構思想拿出來分享,共同學習。

聲明下,沒有花工作的時間來寫這個,一般習慣於夜深人靜的時候,一邊聽着《財經夜讀》一邊總結着自己在軟件領域裏的知識。存檔,然後定期每天一發。

其實服務層架構,是我在兩年前開始研究,只是零零散散沒有弄個文檔出來,以下是我簡要的寫了下,算是關於服務架構第一篇的開題。希望有人給看法和建議,共同提高。

1 基於SOA架構思想設計
服務層有三個主要類:

Request:用戶請求數據

Response:服務響應數據

以上兩個類主要用於客戶端的請求與響應操作。

BusinessHandler:業務處理程序

主要用於業務的父類,這是一個抽象類,用來約束業務遵循服務的規則。

服務規則

<Business>
  
<BusinessHandler type="CRM.Index;CRM" name="BH">
    
<Event name="LoadMenuTree">
      
<Request>
        
<Property type="String">UserId</Property>
        
<Property type="Menu">Menu</Property>
        
<Property type="TreeView">Tree</Property>
        
<Property type="String">Exit</Property>
      
</Request>
    
</Event>
    
<Event name="Login">
      
<Request>
        
<Property type="String">UserId</Property>
        
<Property type="String">UserPwd</Property>
        
<Property type="String">IP</Property>
      
</Request>
      
<Response>
        
<Property type="Boolean">IsLogin</Property>
        
<Property type="String">Theme</Property>
        
<Property type="String">UserName</Property>
      
</Response>
     
</Event>
  
</BusinessHandler>
</Business>

 

注意,在BusinessHandler節點裏,屬性type格式與持久數據層裏的配置類似,用“;”隔開,前面爲Class,後者爲Assembly;而且Assembly有兩種格式:

一是全名,這種可支持GAC

CRM,Version=1.0.4.29079,Culture=neutral,PublicKeyToken=ba9122935f80dbe7

另一種是簡寫格式,一般不支持GAC,要求DLL文件在BIN或當前目錄下:

CRM

最後,此業務規則,配有相應的樣式表,供開發人員方便閱讀規則。同時如果項目逐漸穩定,可以作爲內嵌到DLL裏,如Zivsoft.Services.Principle.dll。

服務層拓展

有時候,弱類型對於代碼改動非常不利,所以會根據業務規則自動生成服務拓展層。在這裏要感謝MS面試我的那幾個面試官,是他們讓我對這個拓展有了興趣。

於是,便自定義出一個Tool自動XmlToCode,代碼如下:(其實這個拓展層其實將會被廢棄,因爲有點得不償失,時間久了,發現並不能彌補什麼。)

ContractedBlock.gifPropertyReader.cs

 

ContractedBlock.gifSchemaExport.cs

 

日誌跟蹤

日誌跟蹤起源於開源框架log4net,配置在學習它的思想,但在我的框架裏,我融入了自己的ColorXml日誌,同時也縮減了很多log4net裏面的功能,這樣才具它的易用性。

4.1 日誌等級

所有日誌分四個等級:Error > Warning > Info > Debug

以下是接口定義:

void LogError(string message, params object[] args)
void LogWarning(string message, params object[] args)
void LogInfo(string message, params object[] args)
void LogDebug(string message, params object[] args)


調用方式非常簡單,舉例如下:

Logger.LogError(“error”);
Logger.LogError(“failed with exception: {0}”, e);

4.2 日誌文件配置

<Log level="DEBUG">
    
<LogFile enabled="false">log"log.log</LogFile>
    
<Console len="30">true</Console>
    
<XmlLog enabled="false">log"log.xml</XmlLog>
</Log>

說明:配置總體格式如上面所示,但有些參數需要在這裏說明一下:

1)     LogFile默認enabledtrue,也就是說如果不指定enabled="false",文件日誌不會關閉。

2)     Console默認情況下也是爲true的,而且長度len默認爲Int32.MaxValue,在這裏我們可以設置-1或者max來獲取最大值。當然實際只要你輸入非自然數,都可以是最大值了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章