MvcApplication! = singleton
co oznacza, że wszystkie powyższe odpowiedzi pomijają punkt i mogą spowodować poważne kłopoty, jeśli niesłusznie uwierzą w dostęp do tej samej instancji, w rzeczywistości będzie ich kilka.
Twoje pierwsze założenie jest nieważne: w przeciwieństwie do (bardzo - widzisz tylko inne odpowiedzi tutaj jako dowód) rozpowszechnionego przekonania, MvcApplication nie jest globalnym singletonem. Ta klasa jest tworzona kilka razy, jedna instancja na "potok", więc licznik wydajności "liczba instancji pipeline" pokazuje, ile instancji MvcApplication jest aktualnie uważanych za żywych. Dodaj domyślnego ctor i udowodnij to sobie:
public MvcApplication()
{
Trace.WriteLine(this.GetHashCode());
}
Debugowanie przerwać linię lub obejrzeć różne kody skrótu w DebugViewer. Aby wymusić wzrost liczby instancji potoku, należy utworzyć metodę z Thread.Sleep (5000), Asp.Net uruchomi następnie nową instancję po kolejnym wywołaniu kolejnego żądania http.
Solution - Jak instancję singletons w aplikacji ASP.NET (MVC lub WebForms)
Jeśli klasa MvcApplication ma jednak metodę Application_Start() to metoda ta nazywa się w rzeczywistości tylko raz, proces szeroko. Możesz tam ustawić pola statyczne. Po prostu umieść je w dowolnej klasie, zazwyczaj MvcApplication jest dobrym konwencjonalnym wyborem i dostęp do nich. Jak
MvcApplication.MySingleValue = 72;
MvcApplication.ActivePlayersCount = 3400;
var n = MvcApplication.ActivePlayersCount;
...
HttpApplication niesamowitość
Konstrukcja klasy HttpApplication i jego wydarzenia jest dość dziwne, który przypuszczalnie ma swoją przyczynę w jakimś luźnym rodzaju kompatybilności wstecz projektu do bardzo starych COM oparte stron ASP. Tam obiekt aplikacji został utworzony tylko raz, co z pewnością jest źródłem błędnego przekonania związanego z Asp.Net.Przykładem dziwności HttpApplication:
protected void Application_Start()
{
}
Zauważ, że nie jest zaangażowany przesłanianie!
Podsumowując, instancje aplikacji mogą być mało przydatne przez większość czasu, nie widzę scenariusza, w którym mogłoby się to zdarzyć w celu utrzymania stanu, ponieważ jego stan byłby współdzielony przez arbitralny podzbiór obsługiwanych żądań. Tak więc dostęp do niego w zupełnie nowy sposób, o którym wspomniał Matt, może nie być wymagany zbyt często.
Czy mógłbyś wytłumaczyć, co chcesz z tym osiągnąć? Może jest inny, jeszcze lepszy sposób na wykonanie tego zadania. – griegs
co chcę: z moją aplikacją mvc, chcę uzyskać wartość zapytania, gdy użytkownik uzyskuje dostęp do strony głównej, takiej jak: http: // localhost: 2929 /? Source = abc. następnie chcę ustawić to źródło = abc w MvcApplication. public class MvcApplication: System.Web.HttpApplication { public string Źródło; // ..... } Następnie chcę źródłowy dostępny dla wszystkich widzenia: Chcę uzyskać dostęp do źródła w konstruktorze kontrolera jak: MvcApplication app = HttpContext.Current.Application jak MvcApplication łańcuch src = app.Source ; ... – KentZhou
Ostrzeżenie: Zanim opuścisz ten wątek z zaznaczoną odpowiedzią, przeczytaj moją odpowiedź poniżej, ponieważ pozostałe odpowiedzi, w tym zaznaczone, są oparte na całkowicie błędnym założeniu, że MvcApplication jest globalnym singletonem. – citykid