私はこの質問をすることを切望していましたが、今はそうする時間しか見つかりませんでした。
とにかく、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アーキテクチャをある程度受け入れるように変換するのに役立つものは見たことがありません。
次の理由に基づいて、多くの人がこれを使用していると確信しています(私は今でもこれをたくさん使用しています)。
- できます。
- 実装、保守、管理が簡単です。
- データベース駆動型開発を行う人々はSQLコマンドに非常に熱心であるため、SQLエディターで使用するSQLチョップをアプリケーションに簡単に使用できることは大きな安堵のため息です。上記の例を使用して複数のクエリ(ストアドプロシージャを含む)をすべて簡単に実装できるのに、なぜORMを使用するのでしょうか。
- データ関連のアプリで利用できるほとんどのコード例は、上記と同じパターンを示しています(データセットは、コマンドオブジェクトから入力され、DataSetまたはXMLなどとして返されます)。
コーディングのこの分野で人々が「ベストプラクティス」と呼ぶものを受け入れるためには、なぜそれが優れているのか、そして動作するように試行されテストされたものよりもはるかに簡単にそのようなことを行うことができる方法を示す必要があります。
ここにいる仲間の専門家の開発者に、変換方法と、RESTへの変換が(コードを介して)優れている理由についての説明をお願いする場合は、それ以上に感謝します。
あなたの入力に感謝します。ありがとう。
追加:これは正しいですが、この記事を読んだ後、このアプローチが最善であるかどうかについて疑問を持ち始めたことを指摘したいと思います。
http://www.codeproject.com/Feature/WeirdAndWonderful.aspx?msg=4324770#xx4324770xx
上記の記事は、ある人がコメントしたように、「私がアップグレードしているWebサービスでこれを見つけました。これに問題がないものを見つけるのは難しいです」と述べています。
私は拘束されているので、これで本当に何が間違っているのかを明らかにしようとしています。
私はあなたにいくつかの状況を与えましょう:
- クライアント/顧客は、データベースに保存されている情報を照会するアプリを提供するように求めています。
- 上記の方法を使用して解決策を考え出します。お客様からのご要望を承ります。このソリューションは、信頼性が高く、高速で、保守が容易です。
つまり、本質的に、私が待ち望んでいたもう1つの質問は、上記のコードの何が本当に間違っているのかということです。