Jag har för det mesta när jag fyllt mina object jobbat med collectioner(ArrayLists). Men när jag nu börjat kolla på ORMappern så tänkte jag höra med er hur ni gör?
Använder ni collectioner eller skickar ni datat till presentationslagret i någon annan form? typ dataset eller datatables??
Oj oj, nu är du inne på en fråga som har delat programmeringsvärlden. Det finns en hel del diskussioner om detta på nätet och även ett par här.
Ena sidan vill ha typade datasets.
Den andra sidan business objects och starkt typade collections.
Jag använder collections och ska snart bygga till en OR Mapper.
Om du ska ha en OR Mapper så ska du använda objekt.
Object Relational Mapper, dvs den skapar relationer till objekt.
Det finns en rätt lång tråd här på webForum som jag vet att du läst som presenterar båda synsätten.
Sedan när det gäller collections, istället för att använda ArrayLists, om det är vad du gör, så skapa en collectionklass som ärver CollectionBase.
Finns mängder av artiklar om just starkt typade collections. Vet att t.ex. 15seconds.com har några bra som jag själv haft användning för.
Ska se om jag kan hitta några länkar.
Har du något kodexempel på starkt typade collections
Vill du ha starkt typade collections så måste du använda dig av Generics annars så så har du bara objekt i din collections, om du däremot använder en generics collections så har du rätt typ av object i din collection.
Här är ett exempel på en starkt typad collection som ärver CollectionBase.
<Serializable()> _
Public Class Users
Inherits CollectionBase
Public Sub Fill(ByVal Reader As IDataReader)
While (Reader.Read = True)
Dim aUser As New User(Reader)
Me.Add(aUser)
End While
End Sub
#Region " Creating strongly typed collection "
Public Sub Insert(ByVal index As Integer, ByVal NewUser As User)
If IsExist(NewUser) = False Then
InnerList.Insert(index, NewUser)
End If
End Sub
Public Sub Remove(ByVal aUser As User)
InnerList.Remove(aUser)
End Sub
Public Function Contains(ByVal aUser As User)
Return InnerList.Contains(aUser)
End Function
Public Function IndexOf(ByVal aUser As User)
Return InnerList.IndexOf(aUser)
End Function
Public Function Add(ByVal NewUser As User) As Integer
If IsExist(NewUser) = False Then
Return InnerList.Add(NewUser)
End If
End Function
Default Public Overloads ReadOnly _
Property Item(ByVal index As Integer) As User
Get
Return CType(innerList.Item(index), User)
End Get
End Property
#End Region
#Region " Business Rules "
Private Function IsExist(ByVal newUser As User) As Boolean
Dim aUser As User
For Each aUser In Me
If aUser.Id = newUser.Id Then
Return True
End If
Next
Return False
End Function
#End Region
End Class
intressant fråga tänkte skriva något liknanden igår men orkade inte..
"Använder ni collectioner eller skickar ni datat till presentationslagret i någon annan form? typ dataset eller datatables??"
Innan var jag helt inne på att använda mig av datasets, då jag trivs bättre med entities istället för datasets i affärslagert. Så om jag har en lista med orders så har jag GetOrders() som returnerar en readonly OrdersArrayList som jag genererat med codesmith. Detta fungerar helt perfekt i de flesta fallen, men när jag skall binda datan till vissa griddar så måste jag i varje rad lägga till ett par kolumner för att få kunna få in dem i mina griddar. Då blir mina typad collections mao värdelösa mer eller mindre. De griddarna som jag använder fungerar jekligt bra med datasets, så det blev en mix, jag har en klass mellan mitt bll och pl, som omformar mina samlingsobjekt till exempelvis datasets om jag nu vill använda det, behöver jag inte de extra kolumnerna så kan jag bara skicka vidare min typad lista till PL. Jag vet inte om detta är den snyggast lösningen men det känns bra att ha ett litet objekt mellan bll å pl, men samtidigt känns det lite overkill i vissa situationer. Så nu har det blivit en mix av ds å listor med objekt som jag skickar till pl. BL har alltid rena objekt å dl är oftast en o/r-mapper. Man kunde gjort en speciell arraylist som ha de här extra kolumnerna men ds går så snabbt att skapa med vs.net
Det som känns fel är att jag nu har både listor och ds i systemet, men hanteringen av affärsregler och objekt känns för mig överlägsen mot att ha separata valideringsobjekt. Samtidigt tycker jag den struktur, stabilitet å flexibilitet som man får en objekt domän modell är suveränt. Det som känns rätt är att jag fått en separation mellan PL å BLL som är väldigt nice. Vill jag tex byta ut mot BLL mot dataset så kan jag göra detta, vill jag att det skall vara en typ av formatering av ett värde i pl så gör jag det, uppdaterat jag fältet så tar mellanobjektet hand om hur det skall formateras i bll, vill jag byta ut bll mot att använda sps så blir detta inte heller några problem. (tror jag :) )
" Jag har för det mesta när jag fyllt mina object jobbat med collectioner(ArrayLists). Men när jag nu börjat kolla på ORMappern så tänkte jag höra med er hur ni gör?"
De flesta O/R-mappers returnerar väl interfaces som IList å IDictionary?
(tänk vad mycket diskussioner dataset vs objekt har genererat)
PDahlen:
Om du gör som du gör så måste du bygga en ny Collection för varje typ av klass du har, alltså en User, UserCollection, Customer CustomerCollection osv osv... Visst blir det starkt typade men extremt mycket kodande/genererande.
Snyggast lösning är som sagt med generics som endast använder sig av en collectionclass som alla typer av klasser kan använda som sin collection, eller så har man bara en collectionclass och så gör man typomvandlig när man hämtar ut datan från den collection eller så gör man som du gjort...
icaaq:
För att hämta en collection från din ORMapper så gör du följande:
Beroende på ditt vilkor som skickas in så hämtas en mängd data från databasen och sedan skapas massor med Foo object och en FooCollection skapas där man lägger dessa alla Foo objekt i, till sist så returneras en CollectionBase från ORMappern som måste castas till din FooCollection när du sedan tar emot den.
Walker:
Skulle misstänka att de flesta ORMapper returnerar egna collectionklasser eller interface, iallafall så gör jag så med min, då jag saknar visa funktioner i den interface som finns i .NET och om jag returnerar ett egen definerat collectionobject så kan jag enkelt lägga till funktioner när jag känner att jag vill plocka ut 10 stycker slumpvalda object från min collection. Eller om det är så att jag endast vill hämta varannat object från collectionen. Om jag använder mig av de Interface som .NET ställer upp med så måste dessa ändå kaplas in med egna klasser för att skapa dessa funktioner och då kan de lika gärna ligga i min collectionbase.
Gladh: Ok, men då måste dina klasser och alla andra som använder dessa ha vetskap om vilka samlingsobjekt, interface som du använder dig av. Men eftersom du använder Collectionbase som redan har implementerat IList så kvittar det ju. Allt handlar om tycke å smak, bara man trivs med det som man jobbar med.
icaaq:
Jag tycker att sånt här handlar mycket om tycke å smak.
Själv skulle jag ha
myManager.GetList(typeof(myObject), criteria) eller kanske
Gladh: Ok, men då måste dina klasser och alla andra som använder dessa ha vetskap om vilka samlingsobjekt, interface som du använder dig av. Men eftersom du använder Collectionbase som redan har implementerat IList så kvittar det ju. Allt handlar om tycke å smak, bara man trivs med det som man jobbar med.
Det stämmer, men är egentligen inget problem eftersom hela min applikation i alla lager (nästan) måste känna till åtminstånde Interfacen till mina klasser, så du tycker inte jag det spelar så stor roll att jag skickar med min egen collectionbase.
icaaq:
Precis som walker säger så finns inget som är rätt eller fel, man gör det som man själv bäst trivs med, sedan finns det en massa tycke och smak, men som sagt ORMapperns vara eller icke vara är ju också omdiskuterad. Gör det som du tycker verkar bäst, och är du inte nöjd så gör om :)
- M
139 ms totalt · 3 externa anrop · v20260731065814-full.4bcf49fe