Jag och en kollega skall bygga en ny applikation som vi tror är relativt okomplicerad, ett par inmatningsformulär, ett par sökmöjligheter, några sorterbara listor, skicka mail och lite annat. Vi kommer bygga med ASP.Net 2.0. Jag tycker att typade Dataset funkar bra i de flesta fall. <b>Jag förstår de som vill ha sina egna typade objekt, men jag tycker det är lite som att uppfinna hjulet igen. Visst Dataset är lite pratiga och har ofta mer funktionalitet än du behöver - men du kommer knappast få en flaskhals i systemet pga det. Det är bra att ha lite att växa i, t.ex. import/export av XML får du på köpet med DS</b>Från databas till presentationslager / Typade Dataset?
Applikationen kommer att ha ett DataAccess-lager, Business-lager, Presentations-lager, kanske att Facade-lager och lite hjälpprojekt vid sidan om, Common, Security etc. Datan lagras i Oracle där vi lägger all SQL i form av paket/stored procedures.
Nu till min fråga som det säkert finns många svar på, hur skickar man bäst datat från DataAccess-lagret upp till Presentations-lagret? Vi är inne på att använda Typade Dataset då vi båda använt det i tidigare projekt och tycker att det funkar väldigt bra. Men jag skulle vilja veta vad det finns för andra sätt och för- och nackdelar med dem? De jag på rak arm kan komma på är:
- Typade Dataset
- Otypade Dataset
- Kollektioner av objekt
Vi kan ta ett typexempel, att läsa upp alla projekt som är aktiva, säg t ex att det genrerar ett recordset från databasen på 20 st poster, för mig känns det väldigt enkelt att stoppa in det i ett typat dataset och skicka det "uppåt" till Presentationslagret.
Finns säkert många åsikter kring detta, känns närmast som att det blir religion ibland när man diskuterar såna här saker...
/MagnusSv: Från databas till presentationslager / Typade Dataset?
Undantag: lite längre listor som ska ut till en WebForm, då kommer Datreader prestera bättre.
Å andra sidan om man utnyttjar cachning, vilket man ju bör om performance är viktigt, så lämpar sig Dataset bättre. (Datareaders går inte att cacha).
Jag förstår de som vill ha sina egna typade objekt, men jag tycker det är lite som att uppfinna hjulet igen. Visst Dataset är lite pratiga och har ofta mer funktionalitet än du behöver - men du kommer knappast få en flaskhals i systemet pga det. Det är bra att ha lite att växa i, t.ex. import/export av XML får du på köpet med DS. Likaså clientside sortering/filtrering av rader. Jag har själv haft stor nytta av dessa features, och sparat många timmars jobb på det.
Om du ska köra egna typade objekt, handkoda dem inte (om de är totalt fler än två st) utan använd åtminstone en kodgenerator. Annars är det verkligen inte försvarligt att göra så IMHO. Tid är pengar. Drag'n'drop precedure/tabell->nytt Dataset funkar bra, du behöver inte köpa eller lära dig en kodgenerator, det finns inbyggt i VS2005. (Å andra sidan om du har massor av tabeller och vill skapa DS automatiskt så fixar de flesta kända kodgeneratorer för .Net detta utmärkt).
Om du har typade DS och behöver lite SOA (kanske för att chefen har hört att det är coolt) då blir det ju en barnlek att spegla ut Dataseten som WebMethods, DS serialsierar sig gärna som XML. Många kafferaster där.
Och till sist: Dataset är en mycket beprövad teknik som uppenbarligen fungerar. Sv:Från databas till presentationslager / Typade Dataset?
Egna typade objekt tar inte många kodrader att serialisera till XML så att det är en fördel vet jag inte.
<code>
UserBusinessObject serializbleObject = new serializbleObject(); //objekt att seralisera
FileStream cfs = new FileStream("c:\tmp.xml", openorcreate);
XmlTextWriter xmlWriter = xmlWriter = new XmlTextWriter(cfs, System.Text.Encoding.Unicode);
XmlSerializer xmlSer = new XmlSerializer(serializbleObject.GetType());
xmlSer.Serialize(xmlWriter, serializbleObject);
xmlWriter.Flush();
xmlWriter.close();
cfs.Close();
</code>
Gör man sedan en metod av det så behöver man bara göra det på ett ställe:
<code>
public void WriteObjectToXMLFile(object serializbleObject, string fileName)
{
XmlTextWriter xmlWriter = null;
FileStream cfs = null;
try
{
cfs = new FileStream("c:\tmp.xml", openorcreate);
xmlWriter = xmlWriter = new XmlTextWriter(cfs, System.Text.Encoding.Unicode);
XmlSerializer xmlSer = new XmlSerializer(serializbleObject.GetType());
xmlSer.Serialize(xmlWriter, serializbleObject);
xmlWriter.Flush();
}
catch (Exception e)
{
throw;
}
finally
{
if (xmlWriter != null)
{
xmlWriter.Close();
xmlWriter = null;
}
if (cfs != null)
{
cfs.Close();
if (cfs is IDisposable)
cfs.Dispose();
}
}
}
</code>
Skrivet ur huvudet så det kanske inte kompilerar direkt.
<b>Om du ska köra egna typade objekt, handkoda dem inte</b>
Vi har massor av object, en lietn del är en gång i tiden skapade av kodgeneringsverktyg men i dagsläget använder vi inget. För oss ställer det inte till några problem eller orsakar att vi får lägga ner onödigt mycket tid på att "underhålla" objekten.