3

Azure Web ロールで実行されている WCF サービスの依存関係の登録を初期化しようとしていますが、クラスの静的コンストラクターが 2 回呼び出されるという非常に異常な動作が見られます。

これは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 デバッガーを使用して) の静的コンストラクターがDependencies2 回呼び出されていることです。1 回目はアプリケーションの元の初期化時、もう 1 回はサービスへの最初の要求時です。後続のリクエストは静的コンストラクターを呼び出しません (予想どおり)。

ランタイムがこのように動作する理由と、依存関係の静的レジストリを生成する代わりに何をすべきかについての説明を聞きたいです。

4

2 に答える 2

4

これは、完全な IIS で Web ロールをホストすると、RoleEntryPoint コードと残りの Web アプリケーションが異なる AppDomains で実行されるためと考えられます。

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」モードを使用し、2つのプロセスを取得します。HTTP要求を処理するためのIISワーカープロセスと、RoleEntryPoint子孫コードを実行するためのロールワーカープロセスです。コードの設計方法によっては、両方のプロセスでその静的コンストラクターを使用することになり、その後2回呼び出される場合があります。

于 2012-11-29T09:13:34.637 に答える