您的位置:首页 > 编程语言

SAP接口编程-Nco3.0系列01 : RfcDestination

2016-03-14 21:53 751 查看
进入新的系列:.net connector 3.0,简称Nco3.0。Nco3.0是SAP针对.net平台提供的编程接口,由nco1.0/nco2.0演变而来。如果使用.net平台编程,推荐使用nco3.0,3.0和之前1.0/2.0比较,不管是API还是架构,都重新设计过,也借鉴了Jco3.0的设计,所以相对来说比较成熟,给程序员提供更好的控制和方便性。

Nco3.0的优点

更加稳定、健壮、安全。关于安全,后面会有相关介绍。

重新设计SAP连接的处理方法:nco3.0程序员不需要自己去管理与SAP的连接(Connection),不需要打开连接、关闭连接、对象销毁。所有这一切由.net connectior 3.0来管理。

增强对大交易数据(不是big data,是mass transactions或heavy load scenario)处理的能力

减少内存耗用

不绑定Visual Studio版本。

.net connector 3.0下载和安装

下载地址: https://service.sap.com/connectors

安装比较简单,其实就是解压,释放几个文件。我们在程序中主要使用sapnco.dll和sapnco_utils.dll这两个动态链接库。WIN7安装(32位),默认的路径是: C:\Program Files (x86)\SAP\SAP_DotNetConnector3。

项目环境准备

1、项目添加引用:添加对sapnco.dll和sapnco_utils.dll的引用。



2、NCO3.0的namespace: nco3.0的namesapce只有一个:SAPP.Middleware.Connector,要在class中导入这个namespace

using SAP.Middleware.Connector;


RfcDestination

RfcDestination代表后端SAP系统。之前SAP的接口技术对SAP系统一般使用Connection对象连接后端系统,nco3.0设计的一个重大改变就是程序员不用再关心SAP的连接,名称也体现了这一点,现在叫Destination了。

RfcDestination对象的创建需要用RfcDestinationManager类的GetConnection方法,以保证只有一个Connection(单例模式)和安全:

// 方法一

public static RfcDestination GetDestination(RfcConfigParameters parameters);

// 方法二

public static RfcDestination GetDestination(string destinationName);

方法1使用RfcConfigParameters作为参数,这个参数包含必要的logon parameters。方法2使用一个字符串作为参数。必须定义一个类,实现IDestinationConfiguration接口,并实现IDestinationConfiguration接口的GetParameters()方法。在GetParameters方法中定义destinationName,RfcDestinationManager.GetDestination方法会自动调用GetParameters方法,获取其中的logon parameters。程序员可以在GetParameters方法中通过文件、UI界面多种方法填充logon parameters,从而赋予程序员较大的自由度,.net connector则保证连接的安全性。

示例一

文件:RfcDestinationDemo.cs

using SAP.Middleware.Connector;

namespace Nco01
{
public class RfcDestinationDemo
{
private RfcConfigParameters GetConfigParams()
{
RfcConfigParameters configParams = new RfcConfigParameters();

// Name property is neccessary, otherwise, NonInvalidParameterException will be thrown
configParams.Add(RfcConfigParameters.Name, "ECC");
configParams.Add(RfcConfigParameters.AppServerHost, "192.168.65.100");
configParams.Add(RfcConfigParameters.SystemNumber, "00"); // instance number
configParams.Add(RfcConfigParameters.SystemID, "D01");

configParams.Add(RfcConfigParameters.User, "STONE");
configParams.Add(RfcConfigParameters.Password, "xxx");
configParams.Add(RfcConfigParameters.Client, "001");
configParams.Add(RfcConfigParameters.Language, "EN");
configParams.Add(RfcConfigParameters.PoolSize, "5");
configParams.Add(RfcConfigParameters.MaxPoolSize, "10");
configParams.Add(RfcConfigParameters.IdleTimeout, "30");

return configParams;
}

public RfcDestination GetDestination()
{
RfcConfigParameters configParams = this.GetConfigParams();
RfcDestination dest = RfcDestinationManager.GetDestination(configParams);

return dest;
}

public void PingDestination()
{
RfcDestination destination = this.GetDestination();
destination.Ping();
}
}
}


单元测试

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Nco01;

namespace UnitTestProject1
{
[TestClass]
public class TestRfcDestinationDemo
{
[TestMethod]
public void TestPing()
{
RfcDestinationDemo rfc = new RfcDestinationDemo();
rfc.PingDestination();
}
}
}


示例二

定义一个类,实现IDestinationConfiguration接口,起始代码如下:

DestinationConfig.cs

using System;
using SAP.Middleware.Connector;

namespace Nco01
{
class DestinationConfig : IDestinationConfiguration
{
public bool ChangeEventsSupported()
{
throw new NotImplementedException();
}

public event RfcDestinationManager.ConfigurationChangeHandler ConfigurationChanged;

public RfcConfigParameters GetParameters(string destinationName)
{
throw new NotImplementedException();
}
}
}


将代码改写成这个样子,填充destinationName为ECC的logon parameters。

using System;
using SAP.Middleware.Connector;

namespace Nco01
{
class DestinationConfig : IDestinationConfiguration
{
public bool ChangeEventsSupported()
{
return false; // 不支持ChangeEvent
}

public event RfcDestinationManager.ConfigurationChangeHandler ConfigurationChanged;

public RfcConfigParameters GetParameters(string destinationName)
{
// get logon parameteres according to destinationName
// the following is logon paramters for 'ECC'
if ("ECC".Equals(destinationName)) {
RfcConfigParameters configParams = new RfcConfigParameters();
configParams.Add(RfcConfigParameters.AppServerHost, "192.168.65.100");
configParams.Add(RfcConfigParameters.SystemNumber, "00"); // instance number
configParams.Add(RfcConfigParameters.SystemID, "D01");

configParams.Add(RfcConfigParameters.User, "STONE");
configParams.Add(RfcConfigParameters.Password, "xxx");
configParams.Add(RfcConfigParameters.Client, "001");
configParams.Add(RfcConfigParameters.Language, "EN");
configParams.Add(RfcConfigParameters.PoolSize, "5");
configParams.Add(RfcConfigParameters.MaxPoolSize, "10");
configParams.Add(RfcConfigParameters.IdleTimeout, "30");

return configParams;
}
else {
return null;
}
}
}
}


RfcDestinationUsingConfig.cs

using SAP.Middleware.Connector;

namespace Nco01
{
public class RfcDestUsingConfig
{
private RfcDestination destination;

// initialize in constructor
public RfcDestUsingConfig()
{
DestinationConfig destConfig = new DestinationConfig();
RfcDestinationManager.RegisterDestinationConfiguration(destConfig);
destination = RfcDestinationManager.GetDestination("ECC");
}

public RfcDestination GetConnection()
{
return destination;
}

public void PingDestination()
{
destination.Ping();
}
}
}


在构造器中初始化RfcDestination,搞得这么复杂,主要就是安全原因。根据ECC这个destinationName,自动调用DestinationConfig类的GetParameters方法,获取logon parameters进行注册,然后进行管理。程序员呢,只需要关心destination就行。

单元测试:

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Nco01;

namespace UnitTestProject1
{
[TestClass]
public class TestRfcDestinationDemo
{
[TestMethod]
public void TestPing()
{
RfcDestinationDemo rfc = new RfcDestinationDemo();
rfc.PingDestination();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: