3

我正在尝试为在 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被调用了两次:一次是在应用程序的原始初始化期间,一次是在第一次请求服务期间。后续请求不会调用静态构造函数(如预期的那样)。

我很想听听为什么运行时会以这种方式运行以及我应该做什么来生成我的静态依赖项注册表的解释。

4

2 回答 2

4

这可能是因为当您在完整的 IIS 中托管 webrole 时,RoleEntryPoint 代码和 web 应用程序的其余部分在不同的 AppDomain 中运行。

http://blogs.msdn.com/b/windowsazure/archive/2010/12/02/new-full-iis-capabilities-differences-from-hosted-web-core.aspx

于 2012-11-28T19:02:19.813 回答
1

默认情况下,您在 Web 角色中使用“完整 IIS”模式,您将获得两个进程 - 用于处理 HTTP 请求的 IIS 工作进程和用于运行RoleEntryPoint后代代码的角色工作进程。根据您的代码的设计方式,您最终可能会在两个进程中使用该静态构造函数,然后它将被调用两次。

于 2012-11-29T09:13:34.637 回答