Damian,
Thanks for the reply. I am not seeing the LifetimeManager behavior you describe in the MileageStats project.
I see instances of UnityHttpContextPerRequestLifetimeManager created only at application startup when the Unity configuration is loaded. Unity uses these LifetimeManagers to manage (i.e. SetValue & GetValue) instances of one particular type. This appears consistent with the one LifetimeManager instance per Unity type registration model. These LifetimeManagers are Disposed at the termination of every client request, but Unity still holds references. This was unexpected as I (wrongly) associate Dispose with C++-style destructor semantics and references being released for garbage collection.
After looking at the code more closely I see the Dispose implementation frees the resources (i.e. RemoveValue) associated with the current request only, not all resources managed by that instance. I missed this initially as I expected Dispose to free all resources associated with an instance. I switched to calling RemoveValue on my LifetimeManagers at the end of requests.
Thanks for the help,
Don
Here is a log with some debug instrumentation I added to track various method calls. I trimmed this to one instance of UnityPerRequestLifetimeManager, the others are similar:
*** Unity Configuration at app startup UnityPerRequestLifetimeManager ctor: 7:34:54 AM ffc6748e-2e45-4ccd-9da7-c28f0c1fffcb *** App home page UnityPerRequestLifetimeManager SetValue: 7:34:56 AM ffc6748e-2e45-4ccd-9da7-c28f0c1fffcb MileageStats.Domain.UserServices UnityPerRequestLifetimeManager Dispose: 7:34:58 AM ffc6748e-2e45-4ccd-9da7-c28f0c1fffcb UnityPerRequestLifetimeManager RemoveValue: 7:34:58 AM ffc6748e-2e45-4ccd-9da7-c28f0c1fffcb MileageStats.Domain.UserServices UnityPerRequestLifetimeManager Dispose: 7:34:58 AM ffc6748e-2e45-4ccd-9da7-c28f0c1fffcb UnityPerRequestLifetimeManager Dispose: 7:34:58 AM ffc6748e-2e45-4ccd-9da7-c28f0c1fffcb UnityPerRequestLifetimeManager Dispose: 7:34:58 AM ffc6748e-2e45-4ccd-9da7-c28f0c1fffcb UnityPerRequestLifetimeManager Dispose: 7:34:58 AM ffc6748e-2e45-4ccd-9da7-c28f0c1fffcb UnityPerRequestLifetimeManager Dispose: 7:34:58 AM ffc6748e-2e45-4ccd-9da7-c28f0c1fffcb UnityPerRequestLifetimeManager Dispose: 7:34:58 AM ffc6748e-2e45-4ccd-9da7-c28f0c1fffcb UnityPerRequestLifetimeManager Dispose: 7:34:58 AM ffc6748e-2e45-4ccd-9da7-c28f0c1fffcb UnityPerRequestLifetimeManager Dispose: 7:34:58 AM ffc6748e-2e45-4ccd-9da7-c28f0c1fffcb UnityPerRequestLifetimeManager Dispose: 7:34:58 AM ffc6748e-2e45-4ccd-9da7-c28f0c1fffcb UnityPerRequestLifetimeManager Dispose: 7:34:59 AM ffc6748e-2e45-4ccd-9da7-c28f0c1fffcb UnityPerRequestLifetimeManager Dispose: 7:34:59 AM ffc6748e-2e45-4ccd-9da7-c28f0c1fffcb UnityPerRequestLifetimeManager Dispose: 7:34:59 AM ffc6748e-2e45-4ccd-9da7-c28f0c1fffcb UnityPerRequestLifetimeManager Dispose: 7:34:59 AM ffc6748e-2e45-4ccd-9da7-c28f0c1fffcb UnityPerRequestLifetimeManager Dispose: 7:34:59 AM ffc6748e-2e45-4ccd-9da7-c28f0c1fffcb UnityPerRequestLifetimeManager Dispose: 7:34:59 AM ffc6748e-2e45-4ccd-9da7-c28f0c1fffcb UnityPerRequestLifetimeManager Dispose: 7:34:59 AM ffc6748e-2e45-4ccd-9da7-c28f0c1fffcb *** Login UnityPerRequestLifetimeManager SetValue: 7:35:55 AM ffc6748e-2e45-4ccd-9da7-c28f0c1fffcb MileageStats.Domain.UserServices UnityPerRequestLifetimeManager Dispose: 7:35:55 AM ffc6748e-2e45-4ccd-9da7-c28f0c1fffcb UnityPerRequestLifetimeManager RemoveValue: 7:35:55 AM ffc6748e-2e45-4ccd-9da7-c28f0c1fffcb MileageStats.Domain.UserServices UnityPerRequestLifetimeManager Dispose: 7:35:56 AM ffc6748e-2e45-4ccd-9da7-c28f0c1fffcb UnityPerRequestLifetimeManager SetValue: 7:35:57 AM ffc6748e-2e45-4ccd-9da7-c28f0c1fffcb MileageStats.Domain.UserServices UnityPerRequestLifetimeManager Dispose: 7:35:58 AM ffc6748e-2e45-4ccd-9da7-c28f0c1fffcb UnityPerRequestLifetimeManager RemoveValue: 7:35:58 AM ffc6748e-2e45-4ccd-9da7-c28f0c1fffcb MileageStats.Domain.UserServices UnityPerRequestLifetimeManager SetValue: 7:35:58 AM ffc6748e-2e45-4ccd-9da7-c28f0c1fffcb MileageStats.Domain.UserServices UnityPerRequestLifetimeManager Dispose: 7:36:00 AM ffc6748e-2e45-4ccd-9da7-c28f0c1fffcb UnityPerRequestLifetimeManager RemoveValue: 7:36:00 AM ffc6748e-2e45-4ccd-9da7-c28f0c1fffcb MileageStats.Domain.UserServices UnityPerRequestLifetimeManager Dispose: 7:36:01 AM ffc6748e-2e45-4ccd-9da7-c28f0c1fffcb UnityPerRequestLifetimeManager Dispose: 7:36:01 AM ffc6748e-2e45-4ccd-9da7-c28f0c1fffcb UnityPerRequestLifetimeManager Dispose: 7:36:01 AM ffc6748e-2e45-4ccd-9da7-c28f0c1fffcb UnityPerRequestLifetimeManager Dispose: 7:36:01 AM ffc6748e-2e45-4ccd-9da7-c28f0c1fffcb UnityPerRequestLifetimeManager SetValue: 7:36:01 AM ffc6748e-2e45-4ccd-9da7-c28f0c1fffcb MileageStats.Domain.UserServices UnityPerRequestLifetimeManager Dispose: 7:36:01 AM ffc6748e-2e45-4ccd-9da7-c28f0c1fffcb UnityPerRequestLifetimeManager Dispose: 7:36:01 AM ffc6748e-2e45-4ccd-9da7-c28f0c1fffcb UnityPerRequestLifetimeManager RemoveValue: 7:36:01 AM ffc6748e-2e45-4ccd-9da7-c28f0c1fffcb MileageStats.Domain.UserServices UnityPerRequestLifetimeManager Dispose: 7:36:01 AM ffc6748e-2e45-4ccd-9da7-c28f0c1fffcb UnityPerRequestLifetimeManager SetValue: 7:36:01 AM ffc6748e-2e45-4ccd-9da7-c28f0c1fffcb MileageStats.Domain.UserServices UnityPerRequestLifetimeManager SetValue: 7:36:01 AM ffc6748e-2e45-4ccd-9da7-c28f0c1fffcb MileageStats.Domain.UserServices UnityPerRequestLifetimeManager Dispose: 7:36:01 AM ffc6748e-2e45-4ccd-9da7-c28f0c1fffcb UnityPerRequestLifetimeManager Dispose: 7:36:01 AM ffc6748e-2e45-4ccd-9da7-c28f0c1fffcb UnityPerRequestLifetimeManager RemoveValue: 7:36:01 AM ffc6748e-2e45-4ccd-9da7-c28f0c1fffcb MileageStats.Domain.UserServices UnityPerRequestLifetimeManager Dispose: 7:36:01 AM ffc6748e-2e45-4ccd-9da7-c28f0c1fffcb UnityPerRequestLifetimeManager RemoveValue: 7:36:01 AM ffc6748e-2e45-4ccd-9da7-c28f0c1fffcb MileageStats.Domain.UserServices UnityPerRequestLifetimeManager Dispose: 7:36:01 AM ffc6748e-2e45-4ccd-9da7-c28f0c1fffcb