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.
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.
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.
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.
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
- https://peterbucher.ch/ - Meine persönliche Seite
- https://fpvspots.net/ - Spots für FPV Dronenflüge
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?
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?
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.
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.
Dieser Beitrag wurde 5 mal editiert, zum letzten Mal von Lexodus am .
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.
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
- https://peterbucher.ch/ - Meine persönliche Seite
- https://fpvspots.net/ - Spots für FPV Dronenflüge
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...