我一直很想问这个问题,但现在才找到时间这样做。
无论如何,关于 Web 服务(是的,那些传统的 SOAP-XML 响应服务)和 RESTful 服务(很多开发人员现在都在使用)的讨论很多。
我觉得虽然我大致了解 REST 的概念,但我需要了解更多。我认为完全接受它的一种最佳方式是表明它确实比目前所做的更好(强调**,因为更好是一个主观词)。
考虑以下简单的传统代码:(此代码是从以 Oracle 作为后端的企业应用程序复制的。我认为数据库几乎无关紧要,因为您可以轻松地在 SQL Server 或 Oracle 或任何数据库之间切换)。
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;
}
}
}
类雇员.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;
}
}
}
数据访问.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。
- 大多数可用于数据相关应用程序的代码示例都显示了与上述相同的模式(从 Command 对象填充数据集,并以 DataSet 或 XML 等形式返回)。
如果要接受人们在这一编码领域中所谓的“最佳实践”,就应该说明为什么它更好,以及做这样的事情比已经尝试和测试工作的事情容易得多。
如果我可以在这里请我们的专家开发人员向我展示如何转换它,并解释为什么转换为 REST 会更好(通过代码),那么我将非常感激。
感谢您的投入。谢谢。
补充:我只是想指出,虽然这是正确的,但在阅读了这篇文章后,我开始怀疑这种方法是否是最好的:
http://www.codeproject.com/Feature/WeirdAndWonderful.aspx?msg=4324770#xx4324770xx
上面的文章,正如一位评论所说的那样——“在我正在升级的网络服务中发现了这个。很难找到任何没有错的地方。”
我正试图确定这到底有什么问题,因为我处于困境中。
让我给你一些情况:
- 客户/客户要求您提供一个应用程序来查询存储在数据库中的信息。
- 您使用上述方法提出了解决方案。提供客户提出的要求。该解决方案可靠、快速且可维护。
所以本质上,我想问的另一个问题是,上面的代码到底有什么问题?