webForumDet fria alternativet

Nytt projekt, databashantering

8 svar · 642 visningar · startad av thevice

theviceMedlem sedan dec. 2005198 inlägg
#1

Hejsan,
Jag har tidigare skapat trådar om hur man ska bygga upp sitt projekt med UI, BLL och DAL. Nu ska jag skapa ett nytt projekt och vill göra på det bästa sättet från början.
Jag hade tänkt att ge mig på en O/R Mapper och har lite frågor angående det.
1. Ska en O/R Mapper fungera som ett DAL? Jag kan ha missförstått hela DAL grejen men i mitt DAL på mitt förra projekt så hade jag kod för att kunna hantera data lättare.
2. Vilken är den bästa O/R Mappern som finns gratis och bra dokumenterat? Då jag inte har tillgång till ASP.NET 3.x så är inte LINQ ett alternativ.

Lite pseudokod för hur man kopplar ihop BLL, O/R, DAL och UI skulle jag vara mycket tacksam för så jag får en inblick i hur jag ska bygga upp projektet.
Sedan en till fråga som inte hör till ämnet, jag ska bygga ett simpelt inloggnings system. Är det bäst att använda sig utav sessions eller forms authentication?

Tacksam för svar, jag har sökt men inte hittat något som förklarar utförligt hur det ska vara uppbyggt.

NickemannenMedlem sedan aug. 20003 575 inlägg
#2

Jag tycker absolut att du skall använda NHibernate som O/R Mapper.
https://www.nhibernate.org,
http://sourceforge.net/project/showfiles.php?group_id=73818,
http://groups.google.com/group/nhusers

Vad gäller arkitektur så kan det utföras på många olika sätt.

Här har du ett exempel:
http://www.codeproject.com/KB/architecture/NHibernateBestPractices.aspx

Det finns även en bok, NHibernate in action.

CatZMedlem sedan jan. 20022 440 inlägg
#3

Det finns flera skolor och Nickemannen brukar förespråka NHibernate. Själv tycker jag mycket bättre om Entity Framework som är en del av .NET 3.5 sp1.

Anledningen: Utvecklingshastigheten!

Om du på dina entiteter behöver stäla en fråga skapar du bara en partial class på i samma namespace som din object model så kommer du åt metoden väldigt smidigt. Det går dessutom mycket snabbt att lära sig.

JonMedlem sedan juli 20011 304 inlägg
#4

1. En o/r mapper har ett DAL i sig som den använder sig av. Tanken är att du inte ska beghöva accessa databasen direkt via detta utan ställa frågor mot din domänmodell som o/r mappern översätter till sql som den låter sitt DAL hantera. Vissa o/r mappers exponerar sitt DAL så man kan använda det och passera själva o/r mappningen.

2. Jag tycker också att NHibernate är bra. NPersist som är en del av puzzle framework är också utmärkt.

Då jag inte har tillgång till ASP.NET 3.x så är inte LINQ ett alternativ

Så jag tror inte att entity framework är ett alternativ ;)

Ett exempel på struktur skulle kunna vara:
UI: Validerar input så nära klienten som möjligt, har en referens till BLL, ropar på t.ex BLL.addCustomer och skickar med ett nytt Customer-objekt med massa information i.

BLL: Startar o/r mappern, och låter den spara customer-objektet och kanske nåt annat (vad det nu kan vara, typ logg eller kopplingar till grupper och medlemskap) inom en transaktion.

Entiteter: Du kan göra ett lager med dina Entiteter (affärsobjekt). Detta lager brukar jag tänka mig som ett vertikalt lager som samtliga andra lager kan referera till.
Om du använder dig av NHibernate så gör man xml-filer som hör till varje entitet som beskriver hur de skall lagras i databasen och hur de förhåller sig till andra entiteter.

Det räcker. Hade du inte använt en o/r mapper hade ditt BLL ropat på ditt DAL för att spara information i databasen. Det du hade fått gör själv i så fall var att generera sql och om du vill använda objekt hela vägen från BLL till UI så hade du varit tvungen att översätta från dina objekt till/från datatables/datareaders och sql. O/R mappern sköter även enklare cache:ning nära databasen som du eventuellt hade velat göra själv.

Det är en ständig debatt hur mycket man skall skikta upp sina applikationer. Man kan göra det precis hur avancerat som helst och i min mening tenderar folk att överarbeta strukturen för sakens skull. En bra tumregel är att när man märker att ens kod mest ropar på ett annat lager med samma information som kom in så gör man dubbelarbete. Argumentet för är naturligtvis att man förenklar skalbarheten.

Vad det gäller inloggningsmekanism så föredrar jag de sätt som det finns inbygt stöd för i .NET dvs forms-inloggning. Jag antar att du med sessions-inloggning menar egen koll av sessionen.

Det finns oändligt mycket att skriva i detta ämne och man kan göra det precis hur avancerat eller enkelt man vill. Gör man det för att öva och förstå finns det ju ett värde i att göra det hela vägen.

Vissa föredrar att lägga logik i sina entiteter för att spara sig själva. Personligen tycker jag att det är lite svårt att få det tillräckligt löst sammankopplat då eftersom man helst inte vill att de ska behöva veta någonting om sql och sådant om man vill ha en utbytbar struktur.

Men som sagt: man tenderar att överkomplicera lösningar och det är i min värld ytterst sällan man verkligen kommer att t.ex byta ut databas helt och hållet. Se istället till att du förenklar korrigeringar och omstruktureringar i din applikation. Det är väldigt vanligt att man vill ändra/bygga ut sin logik, min prio är alltid att underlätta detta.

Detta blev en mindre uppsats, hoppas att du blir klokare. Sätt igång med ett litet projekt och återkom med konkreta frågor :)

theviceMedlem sedan dec. 2005198 inlägg
#5

Hejsan, jag uppskattar era svar.
För att vara rent ärlig så har jag väldigt svårt att lära mig saker som ligger på en "högre" nivå än vanlig .NET. Jag är självlärd och kan absolut inte beskriva det som jag gör i ord, t.ex: Jag kan sitta och göra hur många klasser om dan men jag kan inte förklara att det är en klass, jag vet bara att jag behöver göra det.
Det för mig är ett väldigt stort problem. Annars så hade det inte varit några problem för mig att bara lära mig hur NHibernate fungerar och sedan börja arbeta med det. Jag har läst Gladhs artikel om en egen O/R Mapper men det är rena grekiskan för mig.
Sedan artikeln som Nickemannen skickade på codeproject så satt jag och läste igenom allt då ett par gånger, men jag förstod ändå inte hur det fungerade. Inte för att jag är dålig på engelska utan för att jag inte förstår något utav "programmerings termer". Jag kollade på koden som var med skickad i artikeln men förstod fortfarande inte mycket, jag blev lite klokare men inte för mycket. Därför mina "inlärnings problem" som jag ber om pseudokod.

Jon: Det du beskriv gjorde mig smartare i det hela. Med andra ord om jag har förstått det hela rätt så är det alltså så här:
UI: Ens .ASPX sida, anropar till BLL att hämta t.ex alla kunder
BLL: Gör att anrop till DAL och ber DAL hämta alla kunder
O/R Mapper: Är det som jag kallar DAL, sköter allt själv.
Entiteter: De som O/R fyller med data för att kunna returera till BLL:

Är det rätt? Lite pseudokod för det hela skulle jag uppskatta.

GladhMedlem sedan maj 20012 812 inlägg
#6

Jon skrev:

Det är en ständig debatt hur mycket man skall skikta upp sina applikationer. Man kan göra det precis hur avancerat som helst och i min mening tenderar folk att överarbeta strukturen för sakens skull. En bra tumregel är att när man märker att ens kod mest ropar på ett annat lager med samma information som kom in så gör man dubbelarbete. Argumentet för är naturligtvis att man förenklar skalbarheten.

Det Jon säger är helt korrekt, men man skall alltid tänka ett steg längre, om det är ett litet enkelt enmans projekt som du gör, så ser jag inga problem med att i ditt BLL. Anropa O/RMappern och göra en Save/Load därifrån.

Om du däremot tänker dig ett större projekt, som med tiden kanske växer och där fler folk kommer att involveras, och kanske flera olika datakällor (O/R Mappern fungerar ju inte till alla datakällor) så hade jag haft kvar DAL:et, och låtet BLL anropa DAL som i sin tur tar hand om hur du spara ner informationen till din datakälla. Dels så blir det enklare att byta ut om du nu måste byta ut din O/R Mapper, men framför allt så blir det betydligt mer överblickbart när projektet växer och du helt plötsligt skall hämta data från kanske några webservices, eller kanske en databas som inte stöds av din O/R Mapper osv osv...

Ett sätt att förbereda för ett DAL men ändå ha det i sitt BLL är att man ser till så att allt som har med O/R Mappern att göra ligger i egna funktioner, så du inte blandar logik och dataaccess inne i en och samma funktion i ditt BLL, dela upp dessa i 2 funktioner så fall så är du bättre förbered om du måste dela upp ditt BLL till ett BLL och ett DAL...

- M

theviceMedlem sedan dec. 2005198 inlägg
#7

Gladh, tack för svaret.
Efter mitt förr inlägg så kanske ni förstår vart min kunskap ligger. Jag känner att jag kan göra vad jag vill (men frågan är hur mycket spagetti det blir). För att ni ska kunna hjälpa mig så tänkte jag förklara hur jag hade tänkt mitt projekt:
Det hela går ut på att man kan skapa en egen grupp/klubb/sekt kalla det vad ni vill.
Varje grupp får en egen sida där vissa personer i gruppen (skaparen bestämmer vilka, kan skapa egna roller osv) kan bestämma vilka funktioner man kan ha. De som jag har kommit på än så länge är gästbok, galleri, blogg, listor, medlemmar osv. Jag ska försöka göra så att varje grupp blir som ett CMS så att vissa roller lam bestämma exakt vad som helst.
Som ett exempel: Den som skapade gruppen x skapar en roll i som y går med i. Rollen i har lika mycket ansvar som den som skapade gruppen. De kan bestämma om alla kan skriva i gästboken (icke inloggade/inloggade/bara medlemmar osv)

Jag har svårt att bestämma om detta är ett stort projekt eller inte. Jag vet inte riktigt vad ett CMS är men jag antar att det är det jag vill att varje grupp ska kunna få till sin sida.
Hur skulle ni göra? Jag antar att en O/R Mapper fortfarande är #1 och jag önskar fortfarande pseudokod.

Som sagt, jag kan göra detta projekt på mitt egna vis, men jag vill göra det rätt från början och så att jag lär mig mer inom programmering.

NickemannenMedlem sedan aug. 20003 575 inlägg
#8

Kika lite på asp.net mvc så får du en mer strukturerad arkitektur :)

erkaMedlem sedan dec. 19996 522 inlägg
#9

Fortfarande inte tillgång till 3.5 sedan är det mycket kvar tycker jag innan ASP.NET MVC bör vara i ett skarpt projekt, release 3 just nu, med troligtvis över ett halvår till full release. Men det börjar ta sig :)

131 ms totalt · 3 externa anrop · v20260731065814-full.cf67ef55
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)