4

私はこの質問をすることを切望していましたが、今はそうする時間しか見つかりませんでした。

とにかく、Webサービス(ええ、それらの従来のSOAP-XML応答サービス)とRESTfulサービス(多くの開発者が現在取り組んでいる)について多くの議論がありました。

私はRESTの一般的な概念を理解していますが、もっと学ぶ必要があると感じています。それを完全に受け入れるための最良の方法の1つは、現在行われていることよりも本当に優れていることを示すことです(**を強調することは主観的な言葉です)。

次の単純な従来のコードについて考えてみます(これは、バックエンドとしてOracleを使用するエンタープライズアプリからコピーされます。SQLServer、Oracle、または任意のDBを簡単に切り替えることができるため、データベースはほとんど問題ではないと思います)。

myWebService.asmx.cs

namespace MyApplication
{
    public class myWebService : System.Web.Services.WebService
    {
        private classEmployee _emp = new classEmployee();

        [WebMethod]
        public string GetEmployees()
        {
            string EmployeeData = string.Empty;
            EmployeeData = _emp.GetEmployees();
            return EmployeeData;
        }
    }
}

classEmployee.cs

using System;
using System.Collections.Generic;
using System.Data;
using System.Globalization;
using System.Data.OracleClient;

namespace MyApplication.App_Code
{
    public class classEmployee
    {
        private DataAccess _da;

        public string GetEmployees()
        {
            string employeeData = string.Empty;
            string cmd = string.Empty;
            OracleCommand oraCmd = new OracleCommand();
            DataSet ds = new DataSet();

            try
            {
                 cmd = "SELECT * FROM Employees";

                oraCmd.CommandType = CommandType.Text;
                oraCmd.CommandText = cmd;
                ds = (DataSet)_da.ExecSQLQueryCmd(oraCmd, DataAccess.ResultType.DataSet);
                employeeData = ds.GetXml
                ds.Dispose();
            }
            catch (Exception ex)
            {
                employeeData = "Error: " + "Getting Employees [GetEmployees]" + Environment.NewLine + "Details: " + Environment.NewLine + ex.Message;
            }

            return employeeData;
        }
    }
}

DataAccess.cs

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Data.OracleClient;

namespace MyApplication.App_Code
{
    public class DataAccess
    {
        private OracleConnection oraConn;
        private String connString;

        public enum ResultType
        {
            DataReader = 0,
            DataSet = 1,
            DataTable = 2
        }

        public DataAccess()
        {
            connString = System.Configuration.ConfigurationManager.ConnectionStrings["AppConnectionString"].ConnectionString;
        }

        public object ExecuteSQLCommand(OracleCommand oraCommand, ResultType ReturnType, string TableName = "")
        {
            OracleDataAdapter oraDataAdapter = new OracleDataAdapter(oraCommand);
            oraConn = new OracleConnection(sConnectionString);

            try
            {
                oraConn.Open();
                oraCmd.Connection = oraConn;
                oraCmd.CommandType = CommandType.Text;

                switch (ReturnType)
                {
                    case ResultType.DataReader:
                        OracleDataReader oraDataReader = null;
                        oraDataReader = oraCmd.ExecuteReader();
                        return oraDataReader;

                    case ResultType.DataSet:
                        DataSet ds = new DataSet();
                        oDataAdapter.Fill(ds);
                        oraConn.Close();
                        oraConn.Dispose();
                        return ds;

                    case ResultType.DataTable:
                        DataTable dt = new DataTable();

                        if (!string.IsNullOrEmpty(TableName))
                            dt.TableName = TableName;
                        oDataAdapter.Fill(dt);
                        oraConn.Close();
                        oraConn.Dispose();
                        return dt;
                }
            }
            catch (OracleException oException)
            {
                throw oException;
            }
            finally
            {
                oDataAdapter.Dispose();
                oDataAdapter = null;
                oraCmd.Dispose();
            }

            return null;
        }

        public int ExecuteSQLNonQueryCommand(OracleCommand oraCommand)
        {
            // This will execute any NON-QUERY command.
            //Trimmed for Brevity purposes..
        }
    }
}

上記のコードは非常に自明です。Webサービスを呼び出して、結果のデータをXML形式で取得します。非クエリコマンドを実行するには、コマンドオブジェクトで渡されたコマンド文字列を置き換え、DataAccess.csクラスで必要なメソッドを呼び出すだけです。

上記を少なくとも回避し、代わりにRESTfulサービスタイプの呼び出しを行う必要がある理由について、私はすでにさまざまな意見に圧倒されています。しかし、少なくともこのコードを少なくともRESTfulアーキテクチャをある程度受け入れるように変換するのに役立つものは見たことがありません。

次の理由に基づいて、多くの人がこれを使用していると確信しています(私は今でもこれをたくさん使用しています)。

  1. できます。
  2. 実装、保守、管理が簡単です。
  3. データベース駆動型開発を行う人々はSQLコマンドに非常に熱心であるため、SQLエディターで使用するSQLチョップをアプリケーションに簡単に使用できることは大きな安堵のため息です。上記の例を使用して複数のクエリ(ストアドプロシージャを含む)をすべて簡単に実装できるのに、なぜORMを使用するのでしょうか。
  4. データ関連のアプリで利用できるほとんどのコード例は、上記と同じパターンを示しています(データセットは、コマンドオブジェクトから入力され、DataSetまたはXMLなどとして返されます)。

コーディングのこの分野で人々が「ベストプラクティス」と呼ぶものを受け入れるためには、なぜそれが優れているのか、そして動作するように試行されテストされたものよりもはるかに簡単にそのようなことを行うことができる方法を示す必要があります。

ここにいる仲間の専門家の開発者に、変換方法と、RESTへの変換が(コードを介して)優れている理由についての説明をお願いする場合は、それ以上に感謝します。

あなたの入力に感謝します。ありがとう。

追加:これは正しいですが、この記事を読んだ後、このアプローチが最善であるかどうかについて疑問を持ち始めたことを指摘したいと思います。

http://www.codeproject.com/Feature/WeirdAndWonderful.aspx?msg=4324770#xx4324770xx

上記の記事は、ある人がコメントしたように、「私がアップグレードしているWebサービスでこれを見つけました。これに問題がないものを見つけるのは難しいです」と述べています。

私は拘束されているので、これで本当に何が間違っているのかを明らかにしようとしています。

私はあなたにいくつかの状況を与えましょう:

  1. クライアント/顧客は、データベースに保存されている情報を照会するアプリを提供するように求めています。
  2. 上記の方法を使用して解決策を考え出します。お客様からのご要望を承ります。このソリューションは、信頼性が高く、高速で、保守が容易です。

つまり、本質的に、私が待ち望んでいたもう1つの質問は、上記のコードの何が本当に間違っているのかということです。

4

1 に答える 1

2

変換すると、これは頭のてっぺんから外れていますが、次のようになります。

namespace MyApplication 
{ 
    public class myWebService : System.Web.Services.WebService 
    { 
        private classEmployee _emp = new classEmployee(); 

        [HttpGet]
        public string GetEmployees() 
        { 
            string EmployeeData = string.Empty; 
            EmployeeData = _emp.GetEmployees(); 
            return EmployeeData; 
        } 
    } 
}

そして、消費者が簡単に変換できるものであれば、その文字列を返すことができます。JavaScript の場合は、ネイティブであるため、JSON をお勧めします。

ちょっと話しましょうReST。私が最も面白いと思う部分ReSTは、昔ながらのASMXサービスが ReSTful だったことです。しかし、IT 業界は、古い技術の方がずっと正確だった可能性があるという事実を受け入れることに問題を抱えているため、新しい名前を付ける必要がありました。

彼らは用語Client/Serverでもこれを行いました。IBM は、Microsoft が登場する何年も前にクライアント/サーバーの運用を行っていて、すべてを PC に落とし込む必要があると言っていました。展開が悪夢だったためにその人気が薄れ始めたとき、彼らは、IBM がずっとやってきたことに戻る必要があることに気づきました。大規模なサーバー、ダム クライアント、および単純な展開。しかし、業界がそれを受け入れず、マイクロソフトがそれを望まなかったため、彼らはそれを呼び出すことができませんでしThe Cloud

それでは、SOAP に早送りします。人々は、複雑なオブジェクトを回線経由で転送でき、デシリアライズする必要がなく、プロトコルの柔軟性望んでいました。SOAP は両方を提供し、Microsoft はクライアント表現とデシリアライゼーション生成し、WCF レイヤーはプロトコルの真の柔軟性を可能にしますが、ReSTは標準の動詞を使用するため、HTTP 経由でのみ送信できます。

それで、あなたの質問に対する本当の答えは、何が必要ですか?

  1. SOAP は ReST よりも重く、非常に大きなデータ セットではパフォーマンスが低下することがよくあります。これは、SOAP がブラウザーのネイティブ操作ではなくエンベロープが大きいためです。しかし、繰り返しになりますが、実際にクライアントに転送する必要があるデータの量は?!?
  2. クライアント側モデルのワンクリック生成が必要ですか? 次に、SOAP を使用します。
  3. API を他のプログラミング パラダイムからよりアクセスしやすくしたいですか? 次に、ReST を使用します。
  4. 現時点で、業界の残りの道を進みたいですか?次に、ReST を使用します。

議論すべきことはまだたくさんありますが、それで始められるはずです。ReST は SOAP よりも優れているわけではありません。SOAP とは異なり、異なる一連の問題を解決します。自分自身や他の人に「楽器の法則」について話させないでください。

于 2012-08-03T17:06:17.673 に答える