Это зависит от того, какие данные хранятся в объекте типа Core. Скажем, некоторые данные конфигурации, которые вы хотите отдельно управлять (т. Е. Полностью отличаться от настроек в web.config), тогда это имеет смысл.
Однако, скажем, если веб-сайт является приложением корзины покупок ... и вы хотите сохранить объект пользователя таким образом ... скажем, что пользовательский объект содержит список предметов, которые он сохранил на карте. Это будет храниться в appdomain. Следовательно, это противоречит вашей реализации. Потому что вы хотите, чтобы ваша информация пользователя была привязана к входящему запросу, а не всему приложению. Следовательно, по запросу вам нужно будет запросить это хотя бы один раз ... (говоря в традиционном смысле, конечно).
Продолжая на том же примере, представьте, что вы хотите использовать объект пользователя таким образом: этот пользовательский объект используется внутри разных классов внутри вашего веб-приложения. Традиционно люди пишут код для доступа к db и создания объекта каждый раз, когда вам нужно использовать объект пользователя. Вместо этого вам нужен какой-то одноэлементный шаблон. В этом случае ваш пользовательский объект будет запрашиваться (и создан) из db один раз и повторно использоваться на протяжении всего срока службы запроса. Это возможно, если вы кешируете этот объект (после его создания) в кеш-контексте http ... т. Е. HttpContext.Current.Items["foo"]
Следующий код объясняет точку ...
public class AppUser
{
public string Username { get; set; }
public string[] Roles { get; set; }
public AppUser()
{
var appuser = HttpContext.Session["AppUser"] as AppUser;
if(appuser == null)
throw new Exception("User session has expired");
Username = appuser.Username;
Roles = appuser.Roles;
}
}
public class WebAppContext
{
const string ContextKey = "WebAppContext";
WebAppContext() { } //empty constructor
public static WebAppContext Current
{
get
{
var ctx = HttpContext.Current.Items[ContextKey] as WebAppContext;
if(ctx == null)
{
try
{
ctx = new WebAppContext() { User = new AppUser() };
}
catch
{
//Redirect for login
}
HttpContext.Current.Items.Add(ContextKey, ctx);
}
return ctx;
}
}
public AppUser User { get; set; }
}
Ps: взяты из этого поста: a request level singleton object in asp.net
Смотрите также http://csharpindepth.com/articles/general/singleton.aspx –
Какова ваша причина сделать что-то статическим singleton в asp.net? Есть ли что-то особенно дорогое, что этот класс будет делать? –
Вы не комментируете Частный конструктор? –