Sitter och försöker sätta mig in hela världen kring custom entitys och hittade en bra artikel på DeveloperZone Nej inte på ett enkelt sätt, Jag har sett lite diskussioner i om detta och på några ställen så har jag sett liknande kod som denna: För Lazy Load är det den enklaste varianten ja, du kanske även vill ha koll på om du försökt ladda den förut och den då kommit tillbaka null men i princip räcker det där. om vi snackar asp.net så ör min erfarenhet att det där suger Jag har gjort en egen mall för MyGeneration för att skapa kod och den mallen är baserad på kodexemplen i boken ASP.NET Instant result. Detta borde väl hjälpa till att komma från problemet med kod på massa ställen eller? LazyLoad på enklaste sätt
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/CustEntCls.asp
som beskriver på ett bra sätt hus man ska bygga upp dem. Om man vill hålla det relativt enkelt strukturerat med User och Role objekten så har jag en fundering.
User-objektet har en Roles-property som en collection. Eftersom det är en många-till-många situation så har ju Role-objektet en Users-property som en collection.
Om jag nu skapar ett User-objekt med dess roller betyder inte det då att man kommer hamna i en oändlig loop då Role-objektet i sin tur kommer ladda en lista på användare osv.
För att lösa detta har jag förstått att man får använda sig av lazyloading men jag kan inte hitta hur man skapar detta. Jag skulle vilja på enklast möjliga sätt ordna detta utan att blanda in o/r-mappers eller nåt annat väldigt avancerat. Går det att lösa på nåt enkelt sätt?Sv: LazyLoad på enklaste sätt
Det du pratar om är ett avancerat begrepp och de som bygger det här själva brukar helt enkelt implementera något som liknar en O/R mappare men en billig kopia av de redan beprövade.
Lazy Loading är inte lösningen på ciruklära referenser, det är lösningen på att inte ha för tunga objekt. Dvs jag skall inte behöva ladda hela objektsgrafen om jag inte behöver den.
För att undvika att du skapar en "oändlig loop" använder du istället ngt som heter Identity Map för att se till att du bara har en kopia av varje unikt objekt. Se http://patternshare.org/default.aspx/Home.MF.IdentityMap för mer information.
För att skapa Lazy Loading behöver du ngn form av intercept, exempelvis en koll i början av din Get för att se om du intierat underliggande graf och annars initiera den.
Men som sagt, ju flera sådana här funktioner du kommer vilja, desto mer kommer du önska att du hade en O/R mappare som tog hand om allt det här för dig.Sv:LazyLoad på enklaste sätt
public class School
{
private ArrayList _teachers;
public ArrayList Teachers
{
get
{
if( _teachers == null )
_teachers = LoadTeachers();
return _teachers;
}
}
}
Detta skulle enligt den som skrev posten vara ett enkelt sätt att implementera lazyload på men det känns nästan för enkelt och vad som inte framgår är om det ligger nån mer avancerad styrning i LoadTeachers()Sv: LazyLoad på enklaste sätt
Efter ett tag blir det väldigt mång ställen man bygger samma kod på och i stora projekt kan det bli lite huvudvärk om man behöver ändra hur lazy loadingen fungerar men iaf.
Det du skall vara medveten om är att det inte tar bort de cirkulära referenserna, du kommer fortfarande ha cirukuläritet så om du gör följande:
School.Teachers[0].School.Teachers[0].School.Teachers[0]
så kommer du att ladda om listan om och om igen isf för att återanvädna det faktum att du redan laddat objekten en gång.
Vilket gör att om det bara är ciruläriteten du vill ha bort så tjänar du på att istället implementera en IM eftersom det blir mycket enklare att underhålla över tiden.Sv: LazyLoad på enklaste sätt
så kommer en ny programmerare som bara ser propertyn och anropar den i tid och otid
då snackar vi prestandaprobs
det ska vara tydligt när man laddar grejer så kodaren tar ansvar :)Sv:LazyLoad på enklaste sätt
I den boken refererar de dock inte till relaterade tabeller i objekten utan sätter upp en extra datasource och hämtar informationen baserat på foreign key id i objektet. Så istället för
Property ContentType() As ContentType
så har de
Property ContentTypeId As Integer
Att jag tar upp detta är bara för att ge ett hum om vad jag vill bygga ifrån och som sagt jag vill inte gå för långt utan vill hålla det reltivt simpelt och att jag själv fattar min egen kod men ändå få det att funka någorlunda. Men vad jag borde göra som nästa steg är då att implementera nån form av IdentityMap?