Avatar billede jhauge Nybegynder
14. august 2003 - 13:24 Der er 12 kommentarer og
1 løsning

"Overfør objekt" fra aspx til ascx

Okay det er sikkert simpelt det her, men jeg kan ikke finde et svar nogen steder...

Jeg har en side som bruger nogle kontroller lavet som ascx-filer til at vise nogle menu-elementer.

Til det formål har jeg oprettet nogle menuklasser, som lige nu ligger i en include fil, jeg inkluderer i hver ascx fil der skal bruge menuen. Hver ascx-fil opretter altså sit eget menuobjekt vha. klasserne, som den så bruger til at skrive bestemte dele af menuen ud.

Men det er jo ikke smart - det ville være smartere hvis ascx-filerne kunne deles om menuobjektet, så skulle det kun oprettes en gang, og jeg sparer på den måde noget hukommelse og nogle kald til databasen.

Tanken var så at oprette menuobjektet 1 gang på den aspx side der kalder ascx-filerne, og så overføre menuobjektet til ascx-filerne herfra.

Men hvordan gør man det? Jeg har prøvet at oprette en "Public" variabel i ascx filen som jeg så binder til menuobjektet fra aspx filen, men kan ikke få det til at virke.
Avatar billede quaser Nybegynder
14. august 2003 - 13:34 #1
Efter mit hoved bør du lagde ascx styre det den har brug for. Meningen er jo at den står for en del af siden.
Derfor bør den ikke være afhængig af hvad der sker i aspx delen af siden.

Vil forslå at du bruger et singleton pattern, derved vil du kun få oprettet objectet en gang.
Det er også mulig at gemme objectet i cachen. Det vil også mindske kaldene til databasen.
Avatar billede jhauge Nybegynder
14. august 2003 - 14:12 #2
->quaser

Jeg kan godt se dine pointer, cachen er dog er problem idet menuen bliver opdateret fra et CMS der endnu ikke er porteret til ASP.NET, og jeg kan derfor ikke styre hvornår objektet skal slettes fra cachen på en fornuftig måde.

Hvordan implmenterer jeg et singleton pattern på klassen? I .NET dokumentationen er alle Singleton eksempler jeg kan finde forbundet med remoting, og jeg kan ikke rigtig finde ud af hvordan jeg skal bruge det på en klasse der oprettes fra aspx side.
Avatar billede quaser Nybegynder
14. august 2003 - 14:25 #3
Well, ved brug af singleton får du jo et object, som lever videre mellem request. Og den vil derfor heller ikke være så god.

Kan du ikke bare benytte cache og så sige at den kun må overleve 1-2 min ad gangen. Menuen bliver vel ikke opdateret så tit, og bare administratorne er klar over det.
Hvis der er mange besøgende på siden er 1-2 min. cache faktisk en god performance boost.
Avatar billede jhauge Nybegynder
14. august 2003 - 14:49 #4
-> Singleton
Ja - måske kan man bruge det dokumentationen omtaler som "SingleCall", så vidt jeg forstår virker som Singleton, men kun for hvert request, jeg mangler dog stadig nogle eksempler jeg kan forstå. :(

-> Cache
Jo det kan jeg selvfølgelig, men det vil forringe usability på mit CMS, så det tror jeg jeg venter med, alternativet kunne vel være at lave en funktion på klassen, som på en eller anden måde checker om objektet i cachen skal opdateres og kalde den en gang for hvert request - det vil jeg lige tænke over.

Jeg tænker over det og lader spørgsmålet stå åbent lidt endnu, måske er der nogle andre der har nogle bud :O
Avatar billede quaser Nybegynder
14. august 2003 - 14:57 #5
Synes personlig at cachen er god.
Det med at tjekke om den skal opdateres for hvert request, giver desværre lidt det samme, at du skal have lavet et kald.

Alternativt kan du gemme oplysningerne i din HttpContext.
HttpContext.Current.Items tror jeg at den hedder.
Så laver du bare en statisk metode som du kan kalde fra dine usercontrols. De tjekker så om objectet er lagt i din "HttpContext", hvis den ikke er, skal objectet lave en lås og instancere objectet og derefter gemme den i contexten og lås op igen. På den måde vil du kun få lavet objectet en gang per request.

Alternativt igen kan du lave en httphandler som laver dit object for hvert request. Men der må du selv lige lave noget resource om det nu også er en smart ide.
Avatar billede jhauge Nybegynder
14. august 2003 - 15:42 #6
-> quaser

Du har ret med cachen, det havde jeg ikke tænkt på :O

Sidste metode lyder som den er god at afprøve - jeg takker for sparringen :)

Mvh
Jesper Hauge
Avatar billede burningice Nybegynder
17. august 2003 - 13:08 #7
quaser>> du siger at et singleton-object lever mellem request's ?! hvad har du at underbygge den påstand ? Jeg kan ikke umiddelbart se det logiske i det, da et object der følger singleton-pattern jo bare er et helt normalt object:

public class SingletonObject {
  //Field til at holde instansen af objectet
  private singletonObject SingletonObject = null;
 
  // Gør at man ikke kan kalde constructoren udefra
  private SingletonObject() {

  }

  public SingletonObject Instance {
      get {
        // Gør brug af lazy initialisering
        if (singletonObject == null){
            singletonObject = new SingletonObject();
        }

        return singletonObject;
      }
  }
}
Avatar billede quaser Nybegynder
18. august 2003 - 11:20 #8
Uhm, ja det er måske bare noget jeg går udfra. Medmindre en request lever i et scope for sig.

Ideen med et singleton pattern er jo at det giver mulighed for at oprette en instance og kun en.

Du mangler forøvigt static i din variable og property
Avatar billede burningice Nybegynder
18. august 2003 - 12:51 #9
dow... ja... det har du ret i... jeg hader at skrive kode i et textarea :P

du har ret i, at singleton bliver brugt til at sørge for at der kun bliver lavet et object af en klasse. hvordan det helt præcis fungerer i forbindelse med asp.net skal jeg ikke gøre mig klog på, men jeg har dog altid forestillet mig, at den tid et object lever i, går fra at der kommer et request ind, og indtil at response er blevet skrevet ud igen.
Avatar billede burningice Nybegynder
18. august 2003 - 12:54 #10
dog burde man vel kunne oprette et singleton-object og gemme referencen i en Application-variabel. På den måde burde man kunne opretholde f.eks. en collection mellem request's ?!
Avatar billede jhauge Nybegynder
18. august 2003 - 15:10 #11
Mht. singleton objekters levetid passer det fint med mit behov hvis det kun lever i request'et, mit oprindelige problem gik på at jeg havde et forholdsvis omfanttende objekt, som jeg oprettede 3-4 instances af for hvert request, fordi hver ascx fil der benyttede menuobjektet oprettede sit eget menuobjekt.

Hvorvidt det samme objekt lever over hele requestet har jeg ikke haft tid til at checke, men jeg lover at vende tilbage når/hvis det lykkes at får det på plads.
Avatar billede quaser Nybegynder
18. august 2003 - 15:50 #12
cyberfessor >>
Jeg har benyttet metoden i et jsp/servlet program engang tilbage i min skoletid hvor der skulle oprettes et object som sørgede for at kommunikere med en corba service. Fungerede fint. Eller også var det den gruppe vi samarbejdede med der gjorde det sådan og vi så brugte en anden. Kan jeg ikke lige huske, men det kunne da lade sig gøre.
Avatar billede burningice Nybegynder
18. august 2003 - 18:52 #13
jhauge>> netop til det vil jeg mene, at et singleton-object kan bruges i forbindelse med asp.net. Som jeg selv siger, så ved jeg det ikke 100 %, men jeg tvivler på at et object får lov at leve over flere request's. Jeg mener... med mindre man har gemt referencen et mere "holdbart" sted, så vil der jo blive oprettet nye objecter med nye referencer når siden loades anden gang.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester