插件案例 —— 快速部署的服务接口原创
6人赞赏了该文章
1,408次浏览
编辑于2020年08月12日 10:19:41
案例背景
有的时候,我们的业务插件里面需要于服务端进行交互,包装接口之类的。简单点自用的时候,我们可以调用通版已经封装好的服务,DbServiceHelper、MetaDataServiceHelper之类的,直接取数、取元数据。那么我们自己要如何布置一套RPC服务呢?
案例说明
示例代码
App.Core
namespace XXX.K3.App.Core { [Kingdee.BOS.Util.HotUpdate] public class XXXService : IXXXService { public void UpdateSaleOrder(Context ctx, List<int> entryIds) { string sbSql = ""; DBUtils.Execute(ctx, sbSql, param); } } }
Contract
IXXXService
using Kingdee.BOS; using Kingdee.BOS.Core.Bill; using Kingdee.BOS.Core.DynamicForm; using Kingdee.BOS.Rpc; using System; using System.Collections.Generic; using System.Linq; using System.ServiceModel; using System.Text; namespace XXX.K3.Contracts { [RpcServiceError] [ServiceContract] public interface IXXXService { void UpdateSaleOrder(Context ctx, List<int> entryIds); } }
ServiceFactory
namespace XXX.K3.Contracts { public class ServiceFactory { public static ServicesContainer _mapServer = new ServicesContainer(); static bool noRegistered = true; static ServiceFactory() { RegisterService(); } /// <summary> /// 获及服务实例 /// </summary> /// <typeparam name="T">服务接口类型</typeparam> /// <param name="ctx">上下文</param> /// <returns>服务实例</returns> public static T GetService<T>(Context ctx) { return GetService<T>(ctx, ctx.ServerUrl); } static T GetService<T>(Context ctx, string url) { if (ctx == null) { throw new Exception("{ctx == null}"); } if (noRegistered) { RegisterService(); } var instance = _mapServer.GetService<T>(typeof(T), url); if (instance == null) { throw new Exception("获取服务对象失败,请检查己映射该对象!"); } return instance; } public static void RegisterService() { if (!noRegistered) return; ////增加对应的接口与实现类的对应关系 _mapServer.Add(typeof(IBHRService), "XXX.K3.App.Core.BHRService,BHR.K3.XXX.App.Core"); noRegistered = false; } public static void CloseService(object service) { IDisposable disposable = service as IDisposable; if (disposable != null) { disposable.Dispose(); } } } }
ServiceHelper
namespace XXX.K3.ServiceHelper { public class XXXServiceHelper { public static void UpdateSaleOrder(Context ctx, List<int> entryIds) { IXXXService service = ServiceFactory.GetService<IXXXService>(ctx); try { service.UpdateSaleOrder(ctx, entryIds); } finally { ServiceFactory.CloseService(service); } } } }
赞 6
6人点赞
还没有人点赞,快来当第一个点赞的人吧!
打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!