Я использую MS Enterprise Library 5.0 (блоки доступа к данным) для основного слоя данных моего приложения.Примеры проектирования C# OO для доступа к данным
Хотя я понимаю основы OO (да, мне нужно постоянно учиться - спонтанно!), Я пытаюсь понять, где/почему/как использовать хороший дизайн, т. Е. Не повторяя код, не обязательно и т. д., а также все еще пытается сохранить код простым для чтения и, конечно, отлаживать.
Так первый из летучей мыши, у меня есть следующий класс и по умолчанию/пример метода: (PS: возвращаемое значение из БД/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», который является виртуальным методом, и переопределить параметры? Я знаю, это звучит очень исправно, и это так! часть обучения, я думаю.
Итак, я пытаюсь, конечно, повторно использовать метод «get», где имя params/proc явно отличается, однако фактическое возвращаемое значение (XML в этом случае, следовательно, часть while/append который объединяет возвращаемые блоки XML) должен быть одинаковым, т. е. когда возврат может быть оставлен как XML или если он предоставлен, JSON может быть возвращен.
Я понимаю, что это очень простой материал/концепция, но любые указатели/идеи были бы с благодарностью приняты!
David.
--- EDIT ---
Просто, чтобы показать XML часть SQL 2008, как мне любопытно замечания о не возвращении XML прямо из SQL - снова я вообще понимаю, что получение исходных данных в использовать его по-разному - это хорошо, но в моем случае все мои интерфейсные фреймворки используют либо XML, либо JSON (инфраструктура JS, кстати, является www.dhtmlx.com, которая была потрясающей).
Так прок от SQL 2008 является:
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>
.. который, как именно мне нужны данные, отформатированные для моего переднего конца.
Я вижу причины, по которым нельзя использовать этот метод - то есть, если я использую другую фреймворк или вам нужны данные в прямом datatable, например. Я предполагаю, что могу иметь переменную param для вывода в виде XML или прямой таблицы форма .. или осмелюсь сказать даже два процесса .. но опять же, интересно услышать комментарии в любом случае ...
Еще раз спасибо за все входные данные - это действительно очень ценится.
S - Если ваш пользовательский интерфейс будет отображать этот Xml/Json напрямую, то я действительно не вижу проблемы с тем, что вы делаете. Лучше всего заставить его работать, а затем, если есть проблемы с производительностью, посмотрите на более традиционные подходы. Это также звучит так, будто нет бизнес-уровня, который будет выполнять операции над данными, поэтому почему бы не передать xml прямо? – sheikhjabootie
Да, правда .. страница ASHX в этом случае могла бы сделать этот вызов напрямую. Однако в свете нескольких других проблем с дизайном, я думаю, что я вернусь к тому, чтобы BAL создавал XML/JSON. Несмотря на то, что это дополнительный шаг, имеет смысл разделить все функции, идущие вперёд. Еще раз спасибо за пример/комментарии !! –