SAP接口編程之 Nco3.0系列(01): RfcDestination

進入新的系列:.net connector 3.0,簡稱 Nco3.0。Nco3.0 是 SAP 針對 .net 平臺提供的編程接口,由 Nco1.0/Nco2.0 演變而來。如果使用 .net 平臺編程,推薦使用 NCo3.0。3.0 版與之前1.0/2.0 版本比較,不管是 API 還是架構(gòu),都重新設(shè)計過,也借鑒了 Jco3.0 的設(shè)計,所以相對來說更為成熟,也為程序員提供更好的控制性和方便性。

Nco3.0 的優(yōu)點

  • 更加穩(wěn)定、健壯、安全。關(guān)于安全,后面會有相關(guān)介紹。
  • 重新設(shè)計了 SAP connection 的處理方法:Nco3.0 中開發(fā)者不需要自己去管理與 SAP 的連接 (Connection):不需要打開連接、關(guān)閉連接、Connection 對象銷毀等等。所有這一切由 .Net connectior 3.0 來管理。
  • 增強對大量交易數(shù)據(jù)(不是 big data,而是 mass transactions 或 heavy load scenario) 處理的能力
  • 減少內(nèi)存耗用
  • 不綁定 Visual Studio 版本

.Net connector 3.0 下載和安裝

下載地址: https://service.sap.com/connectors。 安裝比較簡單,其實就是解壓,解壓出幾個文件。我們在程序中主要使用 sapnco.dllsapnco_utils.dll 這兩個動態(tài)鏈接庫。以 Win7 (32位)為例,默認的安裝路徑是: C:\Program Files (x86)\SAP\SAP_DotNetConnector3

使用 Nco 的環(huán)境準(zhǔn)備

1、添加引用

添加對 sapnco.dllsapnco_utils.dll 的引用。

nco3-1-1.jpg

2、導(dǎo)入 Nco 3.0 的 namespace

Nco 3.0 只有一個 namespace:SAPP.Middleware.Connector,在需要用到 Nco 3.0 對象的代碼中導(dǎo)入這個namespace

using SAP.Middleware.Connector;

通過 RfcDestination 建立與 SAP 系統(tǒng)的連接

RfcDestination代表后端 SAP 系統(tǒng)。前面我們說到,在 RFC 技術(shù)中, 一般通過 Connection 對象連接到 SAP 系統(tǒng),Nco3.0 設(shè)計的一個重大改變就是:開發(fā)者不用再關(guān)心與 SAP 的連接,RfcDestination 對象管理連接相關(guān)的工作。

Nco3.0 提供 RfcDestinationManager 類的 GetDestination方法來創(chuàng)建 RfcDestination 實例,并且保證只有一個 RfcDestination 實例 (單例模式):

// 方法一 
public static RfcDestination GetDestination(RfcConfigParameters parameters);

// 方法二 
public static RfcDestination GetDestination(string destinationName);

方法 1 的參數(shù)為 RfcConfigParameters,這個參數(shù)包含必要的登錄參數(shù)。

方法 2 的參數(shù)為連接字符串。這個連接字符串來自于開發(fā)者自定義的,實現(xiàn)了 IDestinationConfiguration 接口的類。IDestinationConfiguration 接口有一個 GetParameters() 方法。實現(xiàn) GetParameters() 方法的時候,需要定義字符串 destinationName。然后,
RfcDestinationManager.GetDestination() 方法會自動調(diào)用 GetParameters() 方法,獲取其中的 logon parameters。開發(fā)者可以在GetParameters() 方法中確定,是將登錄 SAP 所需要的參數(shù)保存在文件中、還是提供一個 UI 界面來填寫登錄信息,開發(fā)人員具有較大的自由度。

設(shè)置 RfcConfigParameters 參數(shù)示例

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

定義字符串 destinationName 示例

定義一個類 DestinationConfig,實現(xiàn) IDestinationConfiguration 接口,起始代碼如下:

// File name: 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();
        }
    }
}

對代碼進行改寫,在 getParameters() 方法中,設(shè)置 logon parameters,并設(shè)置 destinationName 為 ECC 。

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

在構(gòu)造器中初始化 RfcDestination,搞得這么復(fù)雜,主要就是安全原因。有了 ECC 這個 destinationName,就可以自動調(diào)用 DestinationConfig 類的 GetParameters() 方法,獲取 logon parameters 進行注冊。開發(fā)人員呢,只需要關(guān)心 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();
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容