在后臺業務管理系統中使用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會進行關聯處理的。