アプリケーションのメインデータレイヤーにMSEnterpriseLibrary 5.0(データアクセスブロック)を使用しています。
私はOOの基本を理解していますが(はい、私は継続的に学習する必要があります!)、どこで/なぜ/どのように優れたデザインを利用するか、つまりコードを不必要に繰り返さないことなどを理解するよう努めています。それでも、コードを読みやすく、もちろんデバッグできるようにしようとしています。
したがって、最初に、次のクラスとデフォルト/サンプルメソッドがあります:(ps:db / procからの戻り値はXMLです)
public class ajaxget
{
public enum outputType : int { JSON = 0, XML = 1 }
public static string getMemberContacts(string sStartsWith, string sEndswith, outputType eOT)
{
// Get the associated members based upon the criteria
Database db = DatabaseFactory.CreateDatabase("MyDatabase");
DbCommand cmd = db.GetStoredProcCommand("get_memberContactsXML");
db.AddInParameter(cmd, "@memberID", DbType.Int64, Convert.ToInt64(sID));
db.AddInParameter(cmd, "@startsWith1", DbType.String, sStartsWith);
db.AddInParameter(cmd, "@startsWith2", DbType.String, sEndswith);
IDataReader dr = db.ExecuteReader(cmd);
StringBuilder sb = new StringBuilder();
while (dr.Read())
{
sb.Append(dr.GetValue(0));
}
// Clean up
dr.Close();
dr.Dispose();
cmd.Dispose();
// What format to return?
if (eOT == outputType.XML)
{
return sb.ToString();
}
if (eOT == outputType.JSON)
{
XmlDocument xdoc = new XmlDocument();
xdoc.LoadXml(sb.ToString());
return JsonConvert.SerializeXmlNode(xdoc);
}
}
}
だから..これまでのところかなり基本的です。ここで、「getMemberContacts」メソッドをさらに増やす方法のテンプレートを確立しようとしています。つまり、仮想メソッドである一般的な「get」メソッドを作成し、パラメーターをオーバーライドする必要がありますか?私はこれが非常に改善に聞こえることを知っています、そしてそれはそうです!学習の一部だと思います。
要約すると、もちろん、params / proc名が明らかに異なる「get」メソッドを再利用しようとしていますが、実際の戻り値(この場合はXML、したがって、戻り値を連結するwhile /append部分) XMLブロック)は同じである必要があります。つまり、戻り値をXMLのままにするか、指定されている場合はJSONを返すことができます。
これは非常に基本的なもの/概念だと思いますが、どんなポインタ/アイデアもありがたく受け取られます!
デビッド。
- - 編集 - -
SQLから直接XMLを返さないことについてのコメントに興味があるので、SQL 2008 XMLの部分を示すだけです-繰り返しますが、さまざまな方法で使用するために生データを取得することは良いことですが、私の場合はすべて私のフロントエンドフレームワークの1つはXMLまたはJSONのいずれかを使用しています(ちなみにJSフレームワークは素晴らしいですwww.dhtmlx.comです)。
したがって、SQL2008のプロシージャは次のとおりです。
CREATE PROCEDURE [dbo].[get_messagesForMemberXMLByID]
@memberID as bigint=null,
@days as int=-7
AS
BEGIN
SET NOCOUNT ON;
/* Setup the starting point (in the past) from when we wish to select the messages */
Declare @startDate datetime
set @startDate = DateAdd(d,@days, getdate())
SELECT inboxID as "@id", convert(varchar(12),messageCreated,13) as messageCreated, convert(varchar(8), messageCreated,108) as messageCreatedTime, subject,message, messageOpened, messageFrom, messageFromID
FROM bizzbox
WHERE memberID = @memberID
AND convert(char(8), messageCreated, 112) BETWEEN convert(char(8), @startDate,112) AND convert(char(8), getdate(), 112)
ORDER BY messageCreated desc
FOR XML PATH('row'), ROOT('rows')
END
出力は次のようにプルバックされます:
<rows>
<row id="1">
<messageCreated>31 Oct 2010 </messageCreated>
<messageCreatedTime>21:27:32</messageCreatedTime>
<subject>Testing 123</subject>
<message>Wibble Bibble!</message>
<messageFrom>David</messageFrom>
<messageFromID>7</messageFromID>
</row>
</rows>
..これは、フロントエンド用にフォーマットされたデータが必要な方法です。
このメソッドを使用しない理由がわかります。つまり、別のフレームワークを使用したり、たとえばストレートデータテーブルのデータが必要な場合はどうなりますか。XMLまたはストレート表形式で出力するparam変数を使用できると思います。またはあえて2つのprocを言っても..しかし、どちらの方法でもコメントを聞くことに興味があります...
すべての入力に再度感謝します-それは本当に非常にありがたいです。