在后台业务管理系统中使用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会进行关联处理的。