2012-11-15 17 views
4

在我Application_Start我配置使用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下,當它啓動時,一切工作正常。

只要應用程序池已被回收,它就停止工作。不知何故,配置會搞砸了,它不能再解決我的課了。但是,UnityFactory類中的靜態字段configuration仍包含第一次提供的配置。所以班級本身並沒有改變。

Application_Start方法在應用程序池回收後未觸發,因此不會再應用該配置。

如果我設置了一個斷點並再次手動應用配置,它將再次運行。

這裏發生了什麼?爲什麼Unity會忘記我所有的課程?是否有一個我可以訂閱的活動讓我知道游泳池何時回收?

回答

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無法知道它們實際上是與以前相同的程序集,因此無法找到原始類定義。

是否有一個我可以訂閱的事件讓我知道池何時被回收?

可以看出,沒有這樣的事情。

相關問題