2010-11-18 13 views
0

Ich versuche, eine Website mit einem Master-Controller zu erstellen.Es hat zwei Konstruktoren - statische und parameterlose. Nach der Spezifikation sollte die statische zuerst und einmal aufgerufen werden, um statische Mitglieder der Klasse zu initialisieren, aber das hat sie nie getan, warum ist das so? Wie kann ich für einige Mitarbeiter einen einzelnen Speicher implementieren, auf den vom Controller aus zugegriffen werden kann?Asp.Net Mvc Controller statischen Konstruktor

EDIT: Ich denke, ich mache einen Fehler, wenn ich versuche, es zu debuggen, weil heute funktioniert es wie erwartet, statische Konstruktor wird einmal und vor regulären aufgerufen.

Antwort

1

Es ist nicht sehr üblich, statische Konstruktoren für Controller in ASP.NET MVC zu verwenden. Ich weiß nicht, was genau Sie versuchen zu erreichen, aber global.asax Application_Start scheint ein besserer Ort, um Anwendungsinitialisierungen durchzuführen. Was meinst du mit einem einzigen Speicher, auf den der Controller zugreifen kann? Können Sie nicht das Objekt HttpContext.Cache oder das HttpContext.Application Objekt verwenden, das zum Speichern von anwendungsweiten Dingen verwendet wird (im Gegensatz zur Sitzung)? Sie haben auch den Vorteil, threadsicher zu sein, so dass Sie den Zugriff auf diese Speicher nicht synchronisieren müssen.

Soweit der statische Controller-Konstruktor betroffen ist, sollte es vor dem Standardkonstruktor und nur einmal pro Anwendung aufgerufen werden, und das wird von der CLR garantiert. Dazu braucht es genau die folgende Signatur (privat, keinen Rückgabetyp, denselben Namen wie die enthält, Typ) haben:

public class HomeController: Controller 
{ 
    // This is the exact signature of a static constructor 
    static HomeController() 
    { 

    } 
} 
+0

1. Ich möchte ein paar Info-Strukturen haben, die einmal initialisiert werden (so etwas wie const aber nicht genau). Ich möchte nicht, dass diese Strukturen jedes Mal initialisiert werden. Da ich nur Leseoperationen habe, brauche ich keine Synchronisation. Ich weiß, dass ich Cache und Anwendung verwenden kann, aber auf diese Weise werde ich all meinen Controllern Sichtbarkeit zu diesen Strukturen geben und nicht wollen, da ich sie in nur einem verwenden werde. Ich sage nicht, dass mein Weg der richtige ist, also wenn jemand eine bessere Lösung für meine Situation anbieten kann, dann mach das bitte. – devfreak

+0

2. Meine statische Konstruktorsignatur ist genau wie die, die Sie geschrieben haben. Ich versuche es zu debuggen und setze 2 Breakpoints in den statischen und normalen Konstruktor. Der normale Konstruktor wird vor dem statischen aufgerufen. Irgendwelche Ideen warum? – devfreak