SAP接口编程之 NCo3.0之RfcDestination(转)

转载地址:http://www.jianshu.com/p/5a5b4de5e1f1程序员

http://www.jianshu.com/u/fd37d4449963编程

 

进入新的系列:.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。安全

项目环境准备

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


nco3-1-1.jpg

二、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类的GetDestination方法,以保证只有一个Destination(单例模式)和安全:测试

// 方法一 
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则保证链接的安全性。this

示例一

文件:RfcDestinationDemo.csspa

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();
        }
    }
}

  

单元测试:.net

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();
        }
    }
}

示例2

定义一个类,实现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();
        }
    }
}
相关文章
相关标签/搜索