5

Application_Startの場合、Unity-AutoRegistrationツールを使用してUnityを構成します。

UnityFactory.Configure(config => config
    .Include(If.ImplementsITypeName, Then.Register())
    .ExcludeSystemAssemblies()
);

UnityFactoryのクラスは静的です。Configure次のように機能します。

public static void Configure(Func<IAutoRegistration,IAutoRegistration> configuration)
{
    // Store the configuration to be able to apply it again when needed
    UnityFactory.configuration = configuration;

    // Create new UnityContainer
    container = new UnityContainer();

    // Apply configuration
    configuration(container.ConfigureAutoRegistration()).ApplyAutoRegistration();
}

IIS7で実行され、起動時にすべて正常に動作します。

アプリケーションプールがリサイクルされると、動作を停止します。設定がどういうわけか台無しになり、クラスを解決できなくなります。ただし、クラスの静的フィールドconfigurationには、最初に提供された構成が引き続き含まれています。UnityFactoryしたがって、クラス自体は変更されていません。

アプリケーションプールがリサイクルされた後はApplication_Startメソッドがトリガーされないため、構成が再度適用されることはありません。

ブレークポイントを設定して手動で構成を再度適用すると、すべてが再び機能します。

ここで何が起きてるの?Unityが私のすべてのクラスを忘れているのはなぜですか?また、プールがいつリサイクルされたかを知ることができる、購読できるイベントはありますか?

4

1 に答える 1

2

明らかに、アプリケーションプールがリサイクルされると、アセンブリが解放され、Unityはアセンブリ内で宣言されたクラスを見つけることができなくなります。

Unityのアセンブリを具体的にロードすることで、この影響を解決することができました。このようにして、アプリケーションプールがリサイクルされた場合でも、それらはメモリに残ります。

public static void Configure(Func<IAutoRegistration,IAutoRegistration> configuration)
{
    // Create new UnityContainer with auto registration
    container = new UnityContainer();
    var autoRegistration = container.ConfigureAutoRegistration();

    // Load assemblies
    var path = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "bin");
    foreach (string dll in Directory.GetFiles(path, "*.dll", SearchOption.AllDirectories))
    {
        autoRegistration.LoadAssemblyFrom(dll);
    }

    // Apply configuration
    configuration(autoRegistration).ApplyAutoRegistration();
}

そして私の質問に答えるために:

ここで何が起きてるの?Unityが私のすべてのクラスを忘れているのはなぜですか?

アプリケーションプールがリサイクルされると、アセンブリがメモリから解放される場合があります。それらが再び必要になると、それらは再ロードされます。ただし、それらは異なるファイルからのものであるように見えるため、Unityは、それらが実際に以前と同じアセンブリであることを知ることができず、したがって元のクラス定義を見つけることができません。

また、プールがいつリサイクルされたかを知ることができる、購読できるイベントはありますか?

明らかに、そのようなことはありません。

于 2012-11-16T09:02:51.067 に答える