Toon posts:

asp.net + singleton

Pagina: 1
Acties:

Verwijderd

Topicstarter
Goeie middag alweer,

Ik ben begonnen aan een class voor een kruimelpad op een website,het princiepe is simpel er wordt 1 struct en 2 arraylists aangemaakt die statische waardes krijgen tijdens laden van de pagina die vervolgens child/parent links kunnen bijhouden zodat er netjes een pad van links bovenaan de pagina gegenereerd kan worden.

Voor het opbouwen zat ik zelf te denken aan het gebruik maken van een singleton aangezien die maar 1 keer statische paginas inlaad en vervolgens dynamische paginas toevoegt aan een lijstje.

Maar hier is mijn probleem, ik heb zelf nog niet echt gewerkt met singletons (dus het kan zijn dat ik helemaal fout zit te denken). Bij singletons wordt een class die wordt aangeroepen toch gevuld met een bestaande class die gelijk is aan zijn eigen type?
Worden daarbij ook meteen dan waardes weggeschreven naar die nieuwe instantie/kloon van die class?
Dat heb ik dusver uit een artikel kunnen halen, maar bij een voorbeeld code die zij gebruikt zag ik iets vreemds wat ook een exceptie veroorzaakte tijdens het debuggen van de website.

In het volgende voorbeeld wordt het class object weggeschreven binnen in de httpcontext object.
Code van de class:


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Imports Microsoft.VisualBasic

Public Class KruimelPad
    Private alVisitedLinks As New ArrayList
    Private alLinks As New ArrayList
    Private Structure sLink
        Dim iID As Integer
        Dim sLink As String
        Dim sOmschrijving As String
    End Structure

    Private Const SESSION_SINGLETON As String = "SINGLETON"

    Private KruimelPad As KruimelPad

    Public Function CurrentKruimelPad() As KruimelPad
        Dim oSingleton As KruimelPad
        If IsDBNull(System.Web.HttpContext.Current.Session(SESSION_SINGLETON)) Then
            oSingleton = New KruimelPad
            System.Web.HttpContext.Current.Session(SESSION_SINGLETON) = oSingleton
        Else
            oSingleton = CType(System.Web.HttpContext.Current.Session(SESSION_SINGLETON), KruimelPad)
        End If

        Return oSingleton
    End Function

End Class


In dit stuk wordt de class aangeroepen

code:
1
2
3
Dim o_Kruimelpad As KruimelPad
o_Kruimelpad = o_Kruimelpad.CurrentKruimelPad
'exceptie treedt hier op "object reference is not set to an instance"


Ik zou dus graag willen weten of ik dit nu helemaal fout aanpak voor het genereren van een kruimelpad en wat ik kan aanpassen om het eventueel werkend te krijgen

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Zonder je te willen ontmoedigen, maar weet je dat ASP.NET 2.0 daar al standaard functionaliteit voor biedt ? (Dmv een sitemap, en een SiteMapPath als ik me niet vergis).

Over je Singleton vraag: een Singleton is een pattern die er voor zorgt dat je slechts 1 instantie van iedere class kunt hebben. Voor meer info zoek je best eens op Singleton GoF in Google ofzo.
Maar, het komt hier op neer:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class MyClass
{
    private static MyClass _instance;

    public SomeResource blaat;

     public MyClass()
     {
        blaat = new SomeResource();
     }

    public static MyClass Instance
    {
         get
         {
               if( _instance == null )
                     _instance = new MyClass();
               return _instance;
         }
    }
}
Bovenstaande code toont dus een singleton met lazy instantiation; de instance wordt pas gemaakt eens ze voor de eerste keer aangevraagd wordt.
Met dit in het achterhoofd (een singleton laat slechts 1 instance toe), begrijp ik dus niet wat je precies bedoelt met deze vraag :
Worden daarbij ook meteen dan waardes weggeschreven naar die nieuwe instantie/kloon van die class?
Daarom denk ik dat je het concept van Singleton nog niet echt snapt ?

https://fgheysels.github.io/


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Wat mij meteen opvalt is dat je op regel 18 controleert met IsDBNull. Het lijkt me dat je daar gewoon op null moet controleren.

Verder lijkt het me dat je je CurrentKruimelPad static wil maken. In C# zou ik het denk ongeveer zo doen.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class KruimelPad
{
    public static KruimelPad Current
    {
        get
        {
            KruimelPad result;
            if( !(HttpContext.Current.Session[KEY] is KruimelPad) )
            {
                result = new KruimelPad();
                HttpContext.Current.Session[KEY] = result;
            }
            else
            {
                 result = (KruimelPad)HttpContext.Current.Session[KEY];
            }
            return result;
    }
}


edit:
verder idd met Whoami dat het niet echt een Singleton is wat je wilt.

[ Voor 5% gewijzigd door Woy op 24-04-2007 14:30 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
@Whoami/rwb ok, ik heb nog ff verder gegoogled en het verhaal over singletons is nu wel iets duidelijker.
Dan wordt het dus SiteMapPath gebruiken denk ik :).

Iig bedankt.

Verwijderd

whoami en rwb gaven het inderdaad ook al aan: Hier is de standaard sitemap veel beter voor.

Echter zie ik ook dat je een SESSION object gebruikt voor je singleton. Dat zou betekenen dat je voor IEDERE sessie maar één object zou hebben en niet één voor de gehele applicatie (Is dus dan eigenlijk geen singleton). Dan zou je Application state moeten gebruiken (of gewoon een static class met static prop/field) en een goed locking mechanisme inbouwen om dirty read/writes tegen te gaan.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 08:30

gorgi_19

Kruimeltjes zijn weer op :9

Wat versta je onder een 'kruimelpad'? De laatst bezochte pagina's (zonder hierarchie, op volgorde van bezocht) of een platte boom van de boomstructuur van de inhoud van website (met hierarchie)?

Digitaal onderwijsmateriaal, leermateriaal voor hbo

Pagina: 1