zoukankan      html  css  js  c++  java
  • 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)SAPSAP_DotNetConnector3。

    项目环境准备

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


    nco3-1-1.jpg

    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类的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则保证连接的安全性。

    示例一

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

    示例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();
            }
        }
    }
  • 相关阅读:
    python 访问对象的属性与方法
    python 使用类实列化对象
    python 第一个Python类(创建类)
    python 安装第三方模块
    Redux其实很简单(原理篇)
    JavaScript、ES5和ES6的介绍和区别
    Yes,I know the way to learn Ens !
    移动游戏加载性能和内存管理全解析 学习
    内存耗用:VSS/RSS/PSS/USS
    Android性能测试-内存
  • 原文地址:https://www.cnblogs.com/wxc-kingsley/p/7616688.html
Copyright © 2011-2022 走看看