知识共享 - 自定义公共服务类库
金蝶云社区-JohnnyDing
JohnnyDing
5人赞赏了该文章 2261次浏览 未经作者许可,禁止转载编辑于2016年12月02日 09:50:16

背景介绍

需要在应用服务层,增加一个公共服务,供各种插件调用。

本帖按步骤介绍如何实现此类公共服务类库。

第一步:定义一个服务接口

示例代码:
//***************************************************************
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Kingdee.BOS;
namespace JDSample.CustomService.CustServiceHelper
{
///


/// 第一步:定义一个服务接口
///

///
/// 需要单独部署到一个契约类库中:如Kingdee.BOS.Contracts.dll
///
public interface IMyService
{
///
/// 定义一个公共方法:通过调用此方法,调用服务
///

/// 数据库上下文,通常是必须的参数,需要据此访问数据库
string MyFunction(Context ctx);
}
}
//***************************************************************

第二步:在App端组件中,实现IMyService接口

示例代码:
//***************************************************************
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Kingdee.BOS;
namespace JDSample.CustomService.CustServiceHelper
{
///


/// 第二步:在App端组件中,实现IMyService接口
///

///
/// 通常把此类,放在App端类库,如Kingdee.BOS.App.Core.dll
///
public class MyService : IMyService
{
///
/// 实现接口的方法
///

///
/// 需要单独部署到App类库中:如Kingdee.BOS.App.Core.dll
///
public string MyFunction(Context ctx)
{
// TODO : 在此进行服务响应处理
return string.Empty;
}
}
}
//***************************************************************

第三步:定义一个服务实现类构造工厂
用于建立服务接口与实现类之间的对应关系。并提供方法,构建并返回服务接口的实现类实例

示例代码:
//***************************************************************
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace JDSample.CustomService.CustServiceHelper
{
///


/// 第三步:定义一个服务实现类构造工厂
///

///
/// 与服务接口IMyService需要部署在同一个契约类库中,如Kingdee.BOS.Contracts.dll
///
public class MyServiceFactory : Kingdee.BOS.Contracts.ServiceFactory
{
static bool notRegistered = true;
static MyServiceFactory()
{
RegisterService();
}
///
/// 注册服务,以便在调用MyServiceFactory.GetService时,能够顺利的反射创建出接口实例
///

public static new void RegisterService()
{
if (notRegistered)
{
_mapServer.Add(typeof(IMyService).AssemblyQualifiedName,
"JDSample.CustomService.CustServiceHelper.MyService,JDSample.CustomService");
notRegistered = false;
}
Kingdee.BOS.Contracts.ServiceFactory.RegisterService();
}
}
}

//***************************************************************

第四步:定义个服务访问帮助类,以方便用户调用

示例代码:
//***************************************************************
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Kingdee.BOS;
namespace JDSample.CustomService.CustServiceHelper
{
///


/// 第四步:定义个服务访问帮助类,以方便用户调用
///

///
/// 需要单独部署到Helper类库中:如Kingdee.BOS.ServiceHelper.dll
///
public class MyServiceHelper
{
///
/// 提供一些静态方法,快速访问自定义的服务端服务
///

/// 数据库上下文参数,通常是必须的,需据此访问数据库
public static string MyFunction(Context ctx)
{
IMyService service = MyServiceFactory.GetService(ctx);
try
{
return service.MyFunction(ctx);
}
catch
{
throw;
}
finally
{
MyServiceFactory.CloseService(service);
}
}
}
}
//***************************************************************

第五步:插件调用服务

示例代码:
//***************************************************************
var result = MyServiceHelper.MyFunction(this.Context);
//***************************************************************