在後臺業務管理系統中使用Autofac實現微信介面的處理,我們只需要把相關使用到的DLL放到BIN目錄裡面即可,通過IOC控制反轉方式實現對介面的調用。在實現在業務系統裡面,我們本身程式可能已經依賴了很多相關的DLL類庫,這種可以降低對相關DLL的強依賴,而以一種松耦合的方式使用我們所需要的微信介面... ...
在後臺業務管理系統中使用Autofac實現微信介面的處理,我們只需要把相關使用到的DLL放到BIN目錄裡面即可,通過IOC控制反轉方式實現對介面的調用。在實現在業務系統裡面,我們本身程式可能已經依賴了很多相關的DLL類庫,這種可以降低對相關DLL的強依賴,而以一種松耦合的方式使用我們所需要的微信介面。
在之前隨筆《C#開發微信門戶及應用(42)--使用Autofac實現微信介面處理的控制反轉處理》裡面介紹了Autofac組件實現IOC控制反轉的一些實現細節,本篇隨筆介紹在業務管理系統中,我們需要調用微信介面推送一些業務消息,如待辦實現、通知信息等等。使用Autofac組件的控制反轉方式,使得我們只需要關註介面的處理即可,不需要過於關註實現的具體細節。
1、功能處理的介面和實現項目
如我們創建一個項目,用於處理對微信或者第三方組件的一些封裝處理,通過創建處理功能的介面,以及對應的實現,如下所示。
如對微信的處理,我們需要調用微信框架裡面相關的介面封裝項目,首先定義一個消息推送的介面
namespace WHC.Common.Handler { /// <summary> /// 企業微信消息推送介面 /// </summary> public interface ICorpMessage { /// <summary> /// 企業微信的APPID /// </summary> string CorpId { get; set; } /// <summary> /// 企業微信的APPSecret /// </summary> string CorpSecret { get; set; } /// <summary> /// 企業微信應用的ID /// </summary> string AgentId { get; set; } /// <summary> /// 發送消息內容(如任務通知) /// </summary> /// <param name="touser">發送給的用戶企業微信ID</param> /// <param name="title">消息標題</param> /// <param name="description">消息正文(512位元組內)</param> /// <param name="url">跳轉URL</param> /// <returns></returns> CommonResult SendMessageTextCard(string touser, string title, string description, string url); }
我們定義了幾個屬性,就是希望介面能夠少傳一些參數,而且可以在多個實現函數裡面通用的。
具體的發送消息實現類如下所示。
namespace WHC.Common.Handler { /// <summary> /// 企業微信消息推送實現 /// </summary> public class CorpMessage : ICorpMessage { /// <summary> /// 企業微信的APPID /// </summary> public string CorpId { get; set; } /// <summary> /// 企業微信的APPSecret /// </summary> public string CorpSecret { get; set; } /// <summary> /// 企業微信應用的ID /// </summary> public string AgentId { get; set; } /// <summary> /// 發送消息內容(如任務通知) /// </summary> /// <param name="touser">發送給的用戶企業微信ID</param> /// <param name="title">消息標題</param> /// <param name="description">消息正文(512位元組內)</param> /// <param name="url">跳轉URL</param> /// <returns></returns> public CommonResult SendMessageTextCard(string touser, string title, string description, string url) { CommonResult result = new CommonResult(); ICorpBasicApi baseBLL = new CorpBasicApi(); string token = baseBLL.GetAccessToken(CorpId, CorpSecret); if (!string.IsNullOrEmpty(token)) { ICorpMessageApi bll = new CorpMessageApi(); CorpSendTextCard msg = new CorpSendTextCard(title, description, url); msg.agentid = AgentId; msg.touser = touser; result = bll.SendMessage(token, msg); } else { result.ErrorMessage = "無法獲取Token信息"; } return result; } }
這裡最終調用的是微信框架裡面的項目模塊,如下代碼所示
ICorpBasicApi baseBLL = new CorpBasicApi();
這裡我們通過調用介面發送TextCard 文本卡片信息的。
2、在後臺業務管理系統對推送信息介面的調用
首先為了使用IOC的控制反轉處理,我們項目需要引用Autofac和Autofac.Configuration
然後把需要的配置信息卸載Autofac.Config文件裡面,如下文件內容所示,紅框裡面的就是我們這裡使用到的消息發送介面。
但我們完成了配置文件,並把配置文件放在項目根目錄下,就可以通過IOC介面控制反轉的方式,獲得對應的介面實現了,如下代碼所示
//獲取對應的企業微信消息推送介面 var handler = AutoFactory.Instatnce.Container.Resolve<ICorpMessage>();
有了這個介面,我們就可以在實際項目中調用這個介面進行處理企業微信的消息推送了。
例如我們在Web的MVC控制器端實現一個處理函數,如下所示。
/// <summary> /// 批量處理多個任務下發企業微信 /// </summary> /// <param name="billNo">多個billno組成的列表</param> /// <returns></returns> public ActionResult SendTask(string billNoList) { CommonResult result = new CommonResult(); try { if (!string.IsNullOrEmpty(billNoList)) { //獲取對應的企業微信消息推送介面 var handler = AutoFactory.Instatnce.Container.Resolve<ICorpMessage>(); if (handler != null) { //把逗號分隔的字元串轉換為列表 List<string> list = billNoList.ToDelimitedList<string>(","); foreach (string billNo in list) { //獲取盤點主表信息 AssetCheckInfo info = BLLFactory<AssetCheck>.Instance.FindByBillNo(billNo); if (info != null) { //獲取盤點明細~信息~ var detailList = BLLFactory<AssetCheckDetail>.Instance.FindByBillNo(billNo); //讀取配置信息 AppConfig config = new AppConfig(); handler.CorpId = config.AppConfigGet("CorpId"); handler.CorpSecret = config.AppConfigGet("CorpSecret"); handler.AgentId = config.AppConfigGet("AgentId"); //構建推送的消息體內容 string touser = info.CorpUserId; string title = "您有一個盤點任務待處理"; StringBuilder sb = new StringBuilder(); sb.AppendFormat("盤點單號:{0}\r\n", info.BillNo); //sb.AppendFormat("盤點公司:{0}\r\n", info.Company_ID); //sb.AppendFormat("盤點部門:{0}\r\n", info.Dept_ID); sb.AppendFormat("盤點數量:{0}\r\n", info.CheckQty); sb.AppendFormat("指定盤點人:{0}\r\n", info.CorpUserId); sb.AppendFormat("申請日期:{0}\r\n", info.ApplyDate.ToString("yyyy-MM-dd")); string description = sb.ToString(); string url = "http://www.iqidi.com"; //調用企業微信消息介面推送消息 result = handler.SendMessageTextCard(touser, title, description, url); if (result.Success) { //更新盤點表狀態 Hashtable ht = new Hashtable(); ht.Add("TaskStatus", 1);//下發 1 BLLFactory<AssetCheck>.Instance.UpdateFields(ht, info.ID); } } } } } else { result.ErrorMessage = "單號為空"; } } catch (Exception ex) { LogHelper.Error(ex); result.ErrorMessage = ex.Message; } return ToJsonContent(result); }
而在前端的界面裡面,我們可以通過定義一個JS函數來發起任務消息的推動處理。
$("#add").modal("hide"); //構造參數發送給後臺 var postData = { billNoList: billnos, } url = '/AssetCheck/SendTask'; $.post(url, postData, function (json) { var data = $.parseJSON(json); if (data.Success) { //可增加其他處理 //保存成功 1.關閉彈出層,2.刷新表格數據 showTips("下發盤點任務給微信成功"); $("#checkUser").modal("hide"); RefreshAsset(); } else { showError("下發盤點任務給微信失敗:" + data.ErrorMessage, 3000); } }).error(function () { showTips("您未被授權使用該功能,請聯繫管理員進行處理。"); });
最終在我們完成盤點任務創建的時候,通知信息推送到了企業微信客戶端和手機端的企業微信界面上。
當然其他客戶端如果處理這種對IOC的介面調用,一樣的原理,如Winform客戶端,或者是其他.net的項目裡面,我們都可以通過IOC實現對介面實現的控制反轉,進一步解放強依賴的關係,實現松耦合的介面管理。
我們在部署的時候,把使用到的對應DLL複製過去對應的BIN目錄下就可以運行起來了,在我們獲取對應的介面的時候,相關的DLL會進行關聯處理的。