Forschung abgeschlossen!

Also mein Quelltext ist nicht notwendig! Die Instanz der Singleton Klasse ist 
auch nach einem Seite neu laden noch vorhanden! Dabei meine ich keinen Postback 
- sondern ein wirkliches neu laden - über eine ganz normalen HTML Hyperlink!


Kurzusammenfassung:

1. Seitenabruf!

Ich rufe eine Instanz der SingletonClass ab, dabei wird eine neue Instanz 
erstellt - (State = initialisiert!). 

Dann rufe ich eine 2. Instanz der SingletonClass ab, dabei wird die 1. Instanz 
wieder verwendet! - (State = wieder verwendet!)

2. Seitenabruf! (via Hyperlink - also kein Postback!!!)

Beim ersten Abruf der Instanz der SingletonClass wird automatisch die Instanz 
vom 1. Seitabruf verwendet! Der State ist weiterhin "wieder verwendet!".

Beim 2. Abruf natürlich dann auch.

Somit ist das verwenden des Caches nicht notwendig!

Laut Beschreibung zu Singleton's habe ich gelesen, dass sie einen Lebenszyklus 
haben, und wenn dieser abgelaufen ist, wird sie durch den Garbage Collector 
vernichtet. Erst dann wird eine neue Instanz erstellt. Wäre eigentlich 
interessant - wie lang dieser ist!

Ein weiterer Test hat gezeigt, dass die SingletonClass auch über 2 Anfragen 
(mit verschiedenen Browsern) gleich bleibt! Damit würde eine Singleton in etwa 
dem Application Cache entsprechen!

Ok - das war es erstmal.

Mit freundlichen Grüßen
Andreas

Mein Quellcode: (zum selber testen!)

using System;

namespace SingletonTest
{
        /// <summary>
        /// Zusammenfassung für SingletonClass.
        /// </summary>
        public class SingletonClass
        {
                private static SingletonClass _singleton;
                private string _name;
                private string _state;
                
                private SingletonClass()
                {
                        this._name = "Ich bin eine Singleton Klasse!";
                        this._state     = "initialisiert!";
                }

                public string Name
                {
                        get {return this._name;}
                }

                public string State
                {
                        get {return this._state;}
                }

                public static SingletonClass GetInstance()
                {
                        if (_singleton == null)
                        {
                                _singleton = new SingletonClass();
                                return _singleton;
                        }
                        else
                        {
                                _singleton._state = "wieder verwendet";
                                return _singleton;
                        }
                }
        }
}

// Codebehind Seite:
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace SingletonTest
{
        /// <summary>
        /// Zusammenfassung für WebForm1.
        /// </summary>
        public class DefaultForm : System.Web.UI.Page
        {
                protected System.Web.UI.WebControls.Label _lbl_message1;
                protected System.Web.UI.WebControls.Label _lbl_message2;
                protected System.Web.UI.WebControls.Label _lbl_message3;
                protected System.Web.UI.WebControls.Label _lbl_message4;
                
                private void Page_Load(object sender, System.EventArgs e)
                {
                        SingletonClass STC1 = SingletonClass.GetInstance();
                        _lbl_message1.Text      = STC1.Name;
                        _lbl_message2.Text      = STC1.State;

                        SingletonClass STC2 = SingletonClass.GetInstance();
                        _lbl_message3.Text      = STC2.Name;
                        _lbl_message4.Text      = STC2.State;
                }

                #region Vom Web Form-Designer generierter Code
                override protected void OnInit(EventArgs e)
                {
                        InitializeComponent();
                        base.OnInit(e);
                }
                
                private void InitializeComponent()
                {    
                        this.Load += new System.EventHandler(this.Page_Load);

                }
                
                #endregion
        }
}

// Website:
<%@ Page language="c#" Codebehind="default.aspx.cs" AutoEventWireup="false" 
Inherits="SingletonTest.DefaultForm" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
        <HEAD>
                <title>Start</title>
                <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 
7.1">
                <meta name="CODE_LANGUAGE" Content="C#">
                <meta name="vs_defaultClientScript" content="JavaScript">
                <meta name="vs_targetSchema" 
content="http://schemas.microsoft.com/intellisense/ie5";>
        </HEAD>
        <body>
                <form id="Form1" method="post" runat="server">
                        Name:
                        <asp:Label ID="_lbl_message1" Runat="server" /><br>
                        <br>
                        Status:
                        <asp:Label ID="_lbl_message2" Runat="server" /><br>
                        <br>
                        <br>
                        <br>
                        Name:
                        <asp:Label ID="_lbl_message3" Runat="server" /><br>
                        <br>
                        Status:
                        <asp:Label ID="_lbl_message4" Runat="server" />
                        <br /><br />
                        <a href="default.aspx">Reload der Seite (kein 
Postback)</a>
                </form>
        </body>
</HTML>

-----Ursprüngliche Nachricht-----
Von: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] Im Auftrag von kosmi
Gesendet: Donnerstag, 23. Juni 2005 17:13
An: asp.net@glengamoi.com
Betreff: Re: AW: AW: [Asp.net] static, Application oder Session

Ich kenn da auch noch ein paar tote..
Würde mich über die Ergebnisse der Forschungen freuen.

Grüße Daniel

Pessner, Andreas wrote:
> Bin auf jeden Fall dafür, dass man das mal testen sollte.
> 
> Werde das vielleicht morgen mal tun - jetzt mach ich erstmal Feierabend, bin 
> aber schon gespannt auf die Ergebnisse, da ich auch noch ein paar Leichen im 
> Keller liegen habe, die davon sicher profitieren würden!
> 
> -----Ursprüngliche Nachricht-----
> Von: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] Im Auftrag von kosmi
> Gesendet: Donnerstag, 23. Juni 2005 16:58
> An: asp.net@glengamoi.com
> Betreff: Re: AW: [Asp.net] static, Application oder Session
> 
> Die Frage ist ob der Singleton tatsächlich als Application läuft
> oder im page scope.
> Dann wäre auch der Singleton direkt tot und eine Lösung wie die von
> Andreas wäre denkbar...
> Aber schön ist das nicht.
> Dann kann man besser in der Global.asax Instanziieren und in den 
> Application Context packen.
> 
> Andreas Rudischhauser wrote:
> 
>>Das wollte ich ungefähr wissen. Danke. Wird mich mal weiter ans testen
>>machen.
>>
>> -----Ursprüngliche Nachricht-----
>>Von: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] Im
>>Auftrag von Pessner, Andreas
>>Gesendet: Donnerstag, 23. Juni 2005 16:44
>>An: asp.net@glengamoi.com
>>Betreff: AW: [Asp.net] static, Application oder Session
>>
>>Wenn ich das richtig verstanden habe, muss man generell beachten, dass der
>>Lebenszyklus einer Singleton Klasse in einer Web Applikation nur vom Aufruf
>>Start - bis Ende dauert.
>>
>>Somit muss eine Singleton Klasse jeweils bei jedem neuen Aufruf einer
>>Website neu instanziert werden! Dort kannst Du mit dem Session bzw.
>>Application Cache ansetzen!
>>
>>Folgendes wäre denkbar:
>>
>>public class Xy{
>>
>>private static Xy objSingleton= null;
>>
>>
>>private Xy(){
>>
>>}
>>
>>public static Xy GetInstance()
>>{
>>      if (objSingleton == null)
>>      {
>>              // Hole Xy aus dem Session/Application Cache
>>              HttpContext Context = HttpContext.Current;
>>              if (Context.Cache[_Cache_String] != null)
>>              {
>>                      objSingleton = (Xy)Context.Cache["myXyObject"];
>>              }
>>              Else
>>                      return new Xy ();
>>      }
>>      else
>>      return objSingleton;
>>}
>>
>>}
>>
>>Aber wie gesagt - ich habe damit noch nie gearbeitet - und kann sein das ich
>>hier Schrott schreibe!
>>
>>-----Ursprüngliche Nachricht-----
>>Von: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] Im
>>Auftrag von Andreas Rudischhauser
>>Gesendet: Donnerstag, 23. Juni 2005 16:24
>>An: asp.net@glengamoi.com
>>Betreff: AW: [Asp.net] static, Application oder Session
>>
>>Hm, also du hast es richtig verstanden, aber weiter komme ich dadurch noch
>>nicht. Wie würde ich des denn bauen wenn ich es nicht static sondern session
>>mäßig mache? Quasi anstatt das Objekt in der internen static Variable in
>>einer Session ablegen? 
>>
>>2te Frage: Ist dann "static" prinzipiell das Gleiche wie "application" (bis
>>auf Syncronisation)
>>
>>-----Ursprüngliche Nachricht-----
>>Von: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] Im
>>Auftrag von kosmi
>>Gesendet: Donnerstag, 23. Juni 2005 16:15
>>An: asp.net@glengamoi.com
>>Betreff: Re: [Asp.net] static, Application oder Session
>>
>>Was bedeutet deine Datenbankklasse ist ein Singleton?
>>Für mich hört sich das mehr nach static an.
>>Normalerweise  baust du einen Singleton indem du einfach eine
>>Variable in die Klasse packst die vom Typ deiner Klasse ist.
>>Dann machst du den Konstruktor private
>>und baust eine static Methode GetInstance() die dir dein Object
>>instanziiert und auf die Variable legt. Diese wird dann zurückgegeben.
>>Du musst in einer Multiuseranwendung allerdings auf die Synchronisation 
>>achten.
>>
>>
>>public class Xy{
>>
>>private static Xy objSingleton= null;
>>
>>
>>private Xy(){
>>
>>}
>>
>>public static Xy GetInstance()
>>{
>>      if (objSingleton == null)
>>      return new Xy ();
>>      else
>>      return objSingleton;
>>}
>>
>>}
>>
>>Ob du nun jeweils eine Instanz der Klasse in die Session hängst
>>oder bestimmte Sachen als Singelton löst hängt vom Sinn der Klassen ab.
>>
>>Wenn die Klasse Userdaten transportiert(Navigationsstatus) hängst du
>>sie in die Session.
>>Übernimmt sie  aber allgemeingültige Aufgaben (z.b. Propertie Handling)
>>kannst du einen Singleton bauen.
>>
>>Mit hoffentlich alles richtig geschriebenen Grüßen
>>Daniel Wasser
>>
>>
>>Andreas Rudischhauser wrote:
>>
>>
>>>Ich versuche gerade eines meiner etwas größeren Projekte zu verbessern.
>>>Dabei bin ich wieder mal auf konzeptionelle Probleme gestoßen. Es gibt
>>>mehrere Klassen welche ich nur einmal brauche. Hier zum Beispiel die
>>>Datenbanklasse welche mir den Zugriff zur DB kapselt.
>>>
>>>Diese Klasse ist vom Prinzip her ein Singleton. D.h. ich habe daraus eins
>>>gemacht und hole mir die Referenz auf die DB via Database.Current.
>>>
>>>Nun stellt sich mir die Frage wie ich den Singleton machen soll.
>>
>>Prinzipiell
>>
>>
>>>geht das ja über eine interne "static" Variable. In Asp.NET habe ich
>>
>>jedoch
>>
>>
>>>auch noch "Application" und "Session".
>>>
>>>Ein ähnliches Problem stellt sich beim Navigationspfad des Benutzers.
>>
>>Diesen
>>
>>
>>>habe ich bis jetzt in einer globalen Session Variable belassen. Wenn ich
>>
>>das
>>
>>
>>>richtig in eine Klasse umbaue, dann muss das auch ein Singleton sein, wo
>>
>>ich
>>
>>
>>>mit z.B. NavPath.Current drauf zugreife. Wie programmiere ich das hier?
>>>
>>>Ich kann hier nun schlecht "static" verwenden, da es ja im Session Scope
>>>laufen muss.
>>>
>>>Irgendwelche Comments?
>>>
>>>_______________________________________________
>>>Asp.net Mailingliste, Postings senden an:
>>>Asp.net@glengamoi.com
>>>An-/Abmeldung und Suchfunktion unter:
>>>http://www.glengamoi.com/mailman/listinfo/asp.net
>>>
>>>
>>
>>_______________________________________________
>>Asp.net Mailingliste, Postings senden an:
>>Asp.net@glengamoi.com
>>An-/Abmeldung und Suchfunktion unter:
>>http://www.glengamoi.com/mailman/listinfo/asp.net
>>
>>_______________________________________________
>>Asp.net Mailingliste, Postings senden an:
>>Asp.net@glengamoi.com
>>An-/Abmeldung und Suchfunktion unter:
>>http://www.glengamoi.com/mailman/listinfo/asp.net
>>
>>_______________________________________________
>>Asp.net Mailingliste, Postings senden an:
>>Asp.net@glengamoi.com
>>An-/Abmeldung und Suchfunktion unter:
>>http://www.glengamoi.com/mailman/listinfo/asp.net
>>
>>_______________________________________________
>>Asp.net Mailingliste, Postings senden an:
>>Asp.net@glengamoi.com
>>An-/Abmeldung und Suchfunktion unter:
>>http://www.glengamoi.com/mailman/listinfo/asp.net
>>
>>
> 
> _______________________________________________
> Asp.net Mailingliste, Postings senden an:
> Asp.net@glengamoi.com
> An-/Abmeldung und Suchfunktion unter:
> http://www.glengamoi.com/mailman/listinfo/asp.net
> 
> _______________________________________________
> Asp.net Mailingliste, Postings senden an:
> Asp.net@glengamoi.com
> An-/Abmeldung und Suchfunktion unter:
> http://www.glengamoi.com/mailman/listinfo/asp.net
> 
> 
_______________________________________________
Asp.net Mailingliste, Postings senden an:
Asp.net@glengamoi.com
An-/Abmeldung und Suchfunktion unter:
http://www.glengamoi.com/mailman/listinfo/asp.net

_______________________________________________
Asp.net Mailingliste, Postings senden an:
Asp.net@glengamoi.com
An-/Abmeldung und Suchfunktion unter:
http://www.glengamoi.com/mailman/listinfo/asp.net

Reply via email to