在框架中启动的应用程序的标志
本文关键字:应用程序 标志 启动 框架 | 更新日期: 2023-09-27 18:01:00
我正在尝试在HTML模块的应用程序启动中执行一些代码。由于Init((被多次触发,是否有可靠的标志可以告诉我应用程序是否启动?
public class Module : IHttpModule
{
#region IHttpModule Members
public void Dispose()
{
//clean-up code here.
}
public void Init(HttpApplication context)
{
//PROCESS ON APPLICATION START EVENT
this.OnApplicationStart(context);
}
#endregion
public void OnApplicationStart(HttpApplication context)
{
if (!application started??) //FRAMEWORK FLAG?
//DO SOMETHING
}
}
您可以使用一个标志:
public class Module : IHttpModule
{
private static bool isStarted = false;
private static object syncRoot = new object();
public void Dispose()
{
//clean-up code here.
}
public void Init(HttpApplication context)
{
if (!isStarted)
{
lock (syncRoot)
{
if (!isStarted)
{
//PROCESS ON APPLICATION START EVENT
this.OnApplicationStart(context);
isStarted = true;
}
}
}
}
public void OnApplicationStart(HttpApplication context)
{
//DO SOMETHING
}
}
如果您的目标是.NET 4.0或更高版本,作为使用HttpModules执行此任务的更好选择,我建议您使用WebActivator
,这是一个基于Microsoft.Web.Infrastructure
的非常方便的包,允许您在单独的库中订阅Application_Start
等事件。
例如,只需将以下代码放入类库中:
[assembly: WebActivator.PreApplicationStartMethod(typeof(WebAppInitializer), "Start")]
namespace FooBar
{
public static class WebAppInitializer
{
public static void Start()
{
// PROCESS ON APPLICATION START EVENT
}
}
}
然后引用ASP.NET应用程序中的类库即可。
您也可以使用这个方便的WebActivator在HttpModules中执行依赖项注入,并自行注册它们,而无需将它们添加到web.config中。如果您感兴趣,Phil Haack就这个主题编写了一个nice blog post
。