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();
        }
    }
}
相關文章
相關標籤/搜索