插件案例 —— 快速部署的服务接口原创
金蝶云社区-MiLai
MiLai
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人打赏
还没有人打赏,快来当第一个打赏的人吧!