Just want to make sure I am not assuming something foolish here, when implementing the singleton pattern in an ASP .Net web application the static variable scope is only for the current user session, right? If a second user is accessing the site it is a different memory scope…?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
Static members have a scope of the current worker process only, so it has nothing to do with users, because other requests aren’t necessarily handled by the same worker process.
- In order to share data with a specific user and across requests, use HttpContext.Current.Session.
- In order to share data within a specific request, use HttpContext.Current.Items.
- In order to share data across the entire application, either write a mechanism for that, or configure IIS to work with a single process and write a singleton / use Application.
By the way, the default number of worker processes is 1, so this is why the web is full of people thinking that static members have a scope of the entire application.
Method 2
The static variable scope is for the entire app domain, which means other sessions also have access to it. Only if you have a farm with different servers you would have more than one instance of the variable.
Method 3
As others have mentioned, a static variable is global to the entire application, not single requests.
To make a singleton global to only individual requests, you can use the HttpContext.Current.Items dictionary.
public class Singleton
{
private Singleton() { }
public static Singleton Instance
{
get
{
if (HttpContext.Current.Items["yourKey"] == null)
HttpContext.Current.Items["yourKey"] = new Singleton();
return (Singleton)HttpContext.Current.Items["yourKey"];
}
}
}
Method 4
If you need it to be user or session based then check out the following link. Otherwise, as Otavio said, the singleton is available to the entire domain.
http://samcogan.com/singleton-per-asp-net-session/
Method 5
The singleton is used for the entire Application Domain, if you want to store user session-related data, use HttpContext Session which is designed for that purpose. Of course, you probably have to redesign your class structure to be able to come up with a key-value-pair way of dealing with the data you’re trying to work with.
Method 6
Session for entire application per user.
ViewState for single asp page.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0