Я работаю с linq to sql, и поэтому мне нужно сохранить свой DataContext для будущего использования для каждого потока (я прочитал эту статью: http://www.west-wind.com/weblog/posts/246222.aspx относительно способов реализации общего контекста). Однако я хочу знать, как мне создать единый ключ, который будет знать как файл global.asax, так и веб-страница без жесткого кодирования, и если я сделаю это жестко, ключ должен быть конкретным для каждого пользователя.
Большое спасибо!
Вондипло





Что ж, похоже, вы хотите посмотреть на Page.Cache. Это коллекция, доступная на уровне приложения. Он доступен во всех сеансах для всех пользователей.
Добавьте DataContext в область запроса:
В global.asax.cs:
HttpContext.Current.Items["HardcodedKey"] = dataContext;
На странице:
DataContext dc = (DataContext) HttpContext.Current.Items["HardcodedKey"];
Коллекция .Items привязана к отдельному запросу, поэтому для данного ключа каждый запрос будет ссылаться на другой элемент.
Не уверен, почему вы не можете использовать сеанс в Global.asax - вам просто нужно убедиться, что вы вызываете его из нужного места.
По умолчанию в Global.asax очень мало, но есть количество методов, который вы можете реализовать, если хотите, и вам, вероятно, понадобится что-то вроде (протестировано на месте):
void Session_Start(object sender, EventArgs e)
{
// Code that runs when a new session is started
// Pick up your session id here, create a new context and away you go?
var sessionId = Session.SessionID;
Session.Add("sessionId", sessionId);
}
void Session_End(object sender, EventArgs e)
{
// Code that runs when a session ends.
// Note: The Session_End event is raised only when the sessionstate mode
// is set to InProc in the Web.config file. If session mode is set to StateServer
// or SQLServer, the event is not raised.
// Noting comment above, clean up your context if needs be.
}
Тогда на вашем сайте может быть что-то вроде:
protected void Page_Load(object sender, EventArgs e)
{
Literal1.Text = Session["sessionId"].ToString();
}
Я не уверен, что Session - подходящее место для хранения этого, и вы захотите провести некоторое тестирование производительности, чтобы увидеть, сможет ли он справиться с ожидаемыми вами нагрузками.
Рассматривали ли вы что-то вроде IContainerAccessor из фреймворка Castle.Windsor?
Тогда вы можете сделать что-то вроде
public class GlobalApplication : System.Web.HttpApplication, IContainerAccessor
{
private static readonly WindsorContainer _container = new WindsorContainer(new XmlInterpreter(new ConfigResource("castle")));
public IWindsorContainer Container
{
get { return _container; }
}
}
Когда контейнер становится доступным через все приложение, например
var accessor = HttpContext.Current.ApplicationInstance as IContainerAccessor;
var controller = accessor.Container.Resolve<IDataContext>("myDataContext");
Это потребует некоторого исследования Castle Windsor и его возможностей IoC, но мне они будут очень полезны для вас.