在後臺業務管理系統中使用Autofac實現微信接口的處理,咱們只須要把相關使用到的DLL放到BIN目錄裏面便可,經過IOC控制反轉方式實現對接口的調用。在實如今業務系統裏面,咱們自己程序可能已經依賴了不少相關的DLL類庫,這種能夠下降對相關DLL的強依賴,而以一種鬆耦合的方式使用咱們所須要的微信接口。html
在以前隨筆《C#開發微信門戶及應用(42)--使用Autofac實現微信接口處理的控制反轉處理》裏面介紹了Autofac組件實現IOC控制反轉的一些實現細節,本篇隨筆介紹在業務管理系統中,咱們須要調用微信接口推送一些業務消息,如待辦實現、通知信息等等。使用Autofac組件的控制反轉方式,使得咱們只須要關注接口的處理便可,不須要過於關注實現的具體細節。前端
如咱們建立一個項目,用於處理對微信或者第三方組件的一些封裝處理,經過建立處理功能的接口,以及對應的實現,以下所示。json
如對微信的處理,咱們須要調用微信框架裏面相關的接口封裝項目,首先定義一個消息推送的接口微信
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); }
咱們定義了幾個屬性,就是但願接口可以少傳一些參數,並且能夠在多個實現函數裏面通用的。框架
具體的發送消息實現類以下所示。ide
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 文本卡片信息的。post
首先爲了使用IOC的控制反轉處理,咱們項目須要引用Autofac和Autofac.Configurationui
而後把須要的配置信息卸載Autofac.Config文件裏面,以下文件內容所示,紅框裏面的就是咱們這裏使用到的消息發送接口。url
但咱們完成了配置文件,並把配置文件放在項目根目錄下,就能夠經過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會進行關聯處理的。