我正在尝试初始化在Azure Web角色中运行的WCF服务的依赖项注册,但我发现了一种非常不寻常的行为,即我的类的静态构造函数被调用了两次。
这是我用作应用程序依赖项的注册表的Dependencies
类。
public static class Dependencies
{
private static IUnityContainer container;
static Dependencies()
{
Dependencies.container = new UnityContainer();
}
public static IUnityContainer Container
{
get
{
...
}
set
{
...
}
}
public static void ConfigureContainer()
{
var container = new UnityContainer();
// Configure container.
Dependencies.container = container;
}
}
在RoleEntryPoint.OnStart()
的重载中,我调用静态ConfigureContainer
方法来设置容器,并注册了我的依赖项:
public override bool OnStart()
{
// Configure container for dependency resolution.
Dependencies.ConfigureContainer();
return base.OnStart();
}
我的期望是Dependencies
类的静态成员应该由此代码初始化,并且可供应用程序的组件使用。
我所看到的(使用断点和VS2012调试器)是Dependencies
的静态构造函数被调用两次:一次在应用程序的原始初始化期间,再次在第一次请求服务。后续请求不会调用静态构造函数(如预期的那样)。
我很想听到解释为什么运行时的行为方式和我应该做的事情,而不是生成我的静态依赖注册表。
答案 0 :(得分:4)
这可能是因为当您在完整IS中托管Web角色时,RoleEntryPoint代码和其他Web应用程序在不同的AppDomain中运行。
答案 1 :(得分:1)
默认情况下,您在Web角色中使用“完整IIS”模式,您将获得两个进程 - 用于处理HTTP请求的IIS工作进程和用于运行RoleEntryPoint
后代代码的角色工作进程。根据代码的设计方式,最终可能会在两个进程中使用该静态构造函数,然后调用它两次。