Laden...

Zum Start ein WebApp nur eine Instance einer Klasse laden

Erstellt von dr_d00m vor 15 Jahren Letzter Beitrag vor 15 Jahren 2.265 Views
dr_d00m Themenstarter:in
43 Beiträge seit 2008
vor 15 Jahren
Zum Start ein WebApp nur eine Instance einer Klasse laden

Hallo Leute,
ich steh grad vor einem Designproblem und wollt einfach mal ein paar Meinungen einholen.
Also ich möchte von einer selbst erstellten Klasse zu Beginn immer nur eine Instanz laden. Die Klasse ist so ziemlich unveränderlich und lädt einfach immer genutzte Daten aus der Datenbank.
Hört sich ziemlich nach Singleton an, soviel ist klar. Ich weiß aber jetzt nicht genau wo ich einen solchen Aufruf in einer ASP.NET Web-Anwendung platziere. Schreibt man das einfach in die Default.aspx? Ich möchte ja auch vermeiden, dass jeder Nutzer, der die Anwendung aufruft, jedes mal eine neue Instanz der Klasse erzeugt.

Wie geht man dort am besten vor?

Danke schonmal für die Tipps.

Gruß

dr_d00m

Gelöschter Account
vor 15 Jahren

ich bin jetzt nicht gut bewandert in asp geschichten aber spontan gesagt würde ich es über einen service lösen.

dr_d00m Themenstarter:in
43 Beiträge seit 2008
vor 15 Jahren

Hmm, als WebService?
Ich seh im Moment noch nicht ganz die Vorteile, die mir das bringt...

Vielleicht steh ich aber auch einfach nur auf dem Schlauch 😁

5.941 Beiträge seit 2005
vor 15 Jahren

Hallo zusammen

ich bin jetzt nicht gut bewandert in asp geschichten aber spontan gesagt würde ich es über einen service lösen.

Wie stellst du dir das vor, da kann ich nicht wirklich folgen.

@dr_d00m
Was genau macht / hält die Klasse?
Ich würde das in der Global.asax (Application_Start) oder in einem HttpModul (Auch Application_Start) [Je nach Anforderung halt.), platzieren.

Die Daten bzw. Objekte halten kannst du in einer statischen Variable (Application Scope), oder der Application selber (Kommt fast aufs gleiche heraus, siehe Link) speichern.
Auch möglich - je nach dem was du vorhast, ist der Cache.

Ganz wichtig ist dabei, dass solche Daten jeweils im Applikationskontext laufen (Ausser Cache, dort könnest du variieren).
D.h. jeder Benutzer hat den gleichen Status.

Siehe:

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

dr_d00m Themenstarter:in
43 Beiträge seit 2008
vor 15 Jahren

Hallo Peter und Danke für die ausführliche Antwort.
Zu deiner Frage die Klasse hält eine Art Definitionsstruktur für die Datenbank, so dass bestimmte Datenbanktabellen dynamisch angesprochen werden können. Das heißt im Grunde werden hier die Tabellen und ihre Felder hinterlegt, die später angesprochen werden sollen.
Naja, das ganze muss nur einmal geladen werden, da es unveränderlich ist.

Auf jeden Fall werde ich mir die verschiedenen Möglichkeiten mal ansehen.

Gruß,

dr_d00m

J
1.114 Beiträge seit 2007
vor 15 Jahren

Kuck dir mal das Application Objekt in der ASP.NET Anwendung an, dort kannst du mit der Add-Methode beliebe Objekte reinpacken, die dann auch beim nächsten Aufruf der Application erhalten bleiben.

5.941 Beiträge seit 2005
vor 15 Jahren

Hallo dr_d00m

Nimm in deinem Fall Application_Start zum Füllen und schiebe die Daten in Application.Item(.... bzw. Application.Add(....

Application deshalb, weil es für jeden Benutzer gleich ist.
Cache ginge auch, jedoch bringt das nur Vorteile, wenn du verschiedene Versionen halten möchtest.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

L
254 Beiträge seit 2005
vor 15 Jahren

Hallo zusammen

Ich hätt da auch noch ne zusätzliche Frage;

Ich hab mal Versucht ähnlich wie im Thread beschrieben ne Instanz einer Klasse über die Global:System.Web.HttpApplication Class zu verfügung zu stellen.

Nun bin ich mir nicht ganz sicher, aber meine Frage ist.

Wenn ich auf diese Klasse von der Page aus zugreifen will, dann muss ich das immer folgendermassen machen?

MeineKlasse klasse = Application["IdMeinerKlasse"]

Oder gibts da was stärker typisiertes, resp. kann ich von meiner Page irgendwie auf die Instanz der Global Klasse zugreifen?

Wenn ich die Klasse als Statischen Member und mittels Properties zugreifbar mache, dann seh ich es in meiner Page wenn ich sowas aufrufe;

Global.GetInstanceOfMeineKlasse()

Ich hab dann aber gelesen dass das Application Object (also die Global) mehrfach erstellt werden kann und ich mir Probleme mit der ThreadSafety eihandeln kann.

Wie auch immer ich hab aber keinen anderen Weg gefunden auf die Instanz der Global zuzugreifen, ist das einfach so by Design und ich muss mir die Klassen immer mit nem Indexer zugriff holen?

If you can't make it, fake it.

5.941 Beiträge seit 2005
vor 15 Jahren

Hallo Lexodus

Du kannst dir einen Wrapper um die Application Klasse bauen, dann brauchst du nicht immer den Indexer.

Du musst aber schauen, was du dort speicherst.
Stichwort Threadsicherheit und Application Scope.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

L
254 Beiträge seit 2005
vor 15 Jahren

Danke für die Antwort

Der Wrapper würde dann wohl in etwa so aussehen wenn ich das richtig Verstehe

public class Global : System.Web.HttpApplication
{

MeineKlasse GetMeineKlasse
{

get{return Application["indexer"] as MeineKlasse;}

}

}

Und die instanzierung würde ich im

protected void Application_Start(object sender, EventArgs e)
{
Application.Add("indexer",new MeineKlasse());
}

Hab ichs soweit gepeilt? (Ich bin ein bischen unsicher weil ich die Collection über Application.Add befülle und nicht mittels this oder ähnlichem)

@Edit

Bei diesem Beispiel bekomme ich dann aber probleme weil ich die Methoden Statisch machen müsste, also das "GetMyKlass" und das kann ich dann wieder nicht weil die Application[] Liste nicht statisch ist.

Ich bin dann aber auf diesen Artikel gestossen;
http://www.csharphelp.com/archives/archive206.html

Und dann auf diesen
http://www.it-visions.de/dotnet/aspnet/ASPNET_global.asax.aspx

Hier wird ein Ansatz beschrieben bei dem man im Markup das Objekt bekanntmachen muss...

@Edit2

Mein letzter Stand soweit ist, dass ich die Klassen so wies aussschaut sowieso statisch machen muss, da geht kein Weg dran vorbei. Dann gehe ich aber nicht über dieses ApplicationStatus object wie oben beschrieben sondern mach es direkt mit statischen membern.

Irgendwie stellt sich bei mir dann die Frage wieso ich überhaupt das Application Objekt brauche, eigentlich verhält es sich dann genau so wie wenn ich irgendeinen Typen nehme und den statisch mache.
Ist mir ziemlich schleierhaft was das ganze soll im Inet finden sich aber auch viele halbfertige und halbwahre Artikel zu diesem Thema.

If you can't make it, fake it.

L
254 Beiträge seit 2005
vor 15 Jahren

Hatte ne Idee als ich im Web rumgestöbert hab.

Wenn ich das ganze mittels Extension methods realsiere kann ich im "quasi" statischen Context auf die Application und Session Collections zugreifen und hab mehr oder weniger das was ich will.

Die globals.asax scheint einfach net zu funktionieren, mal nicht so wies auf msdn und sonst wo steht.

If you can't make it, fake it.

5.941 Beiträge seit 2005
vor 15 Jahren

Hallo Lexodus

Nein, ich dachte an sowas:

einfach mit der Nutzung des Application-Objekts.
Wenn du statische Variablen nimmst, musst du dich selber um die Synchronisierung kümmern, das Application-Objekt nimmt dir die Synchronisierung ab.

Wie sieht deine Idee mit den Extensionmethods aus?

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

L
254 Beiträge seit 2005
vor 15 Jahren

Ja genau an das dachte ich auch.

Ich mein nur das wenn man es mit Extension Methods macht kann man das genau wie in deinem Artikel wrappen.

Dann hat man es aber direkt auf Application.MeineKlasse (und nicht in einer andere Statischen Klasse, die Generischen Typen hat man dann auch nicht im "interface")

Mir gings hier aber auch darum das der weg mittels <object> im global.asax nicht funktioniert so wie auf MSDN beschrieben...

If you can't make it, fake it.

5.941 Beiträge seit 2005
vor 15 Jahren

Hallo Lexodus

Mir gings hier aber auch darum das der weg mittels <object> im global.asax nicht funktioniert so wie auf MSDN beschrieben...

Ich habe es noch nie benutzt, geschweige den benötigt.
Gesehen habe ich das nie im Einsatz.

Ich könnte mir gut vorstelllen, dass das nicht mehr aktuell ist und evt. in einer früheren Version mal geklappt hat.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011