IUnityContainer.CreateChildContainer() 抛出 NullReferenceException

IUnityContainer.CreateChildContainer() throws NullReferenceException

我们有一个使用 Unity 2.1.505.0 的应用程序。我们的应用程序使用 Web.API 和自定义 DependencyResolverAdapter 来为我们的 API 控制器启用依赖注入。在这个适配器中,我们调用 IUnityContainer 上的 CreateChildContainer() 方法。但是,此调用间歇性地抛出 NullReferenceException:

在什么情况下此方法会抛出 NullReferenceException?堆栈跟踪没有揭示任何明显的原因:

at Microsoft.Practices.Unity.UnityContainer..ctor(UnityContainer parent)
at Microsoft.Practices.Unity.UnityContainer.CreateChildContainer()
at MyApp.DependencyResolverAdapter.BeginScope() in C:\ResCollection\CropProtection\MyApp\MyApp\DependencyResolverAdapter.cs:line 43
at System.Net.Http.HttpRequestMessageExtensions.GetDependencyScope(HttpRequestMessage request)
at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator)
at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)

奇怪的是,在执行 "Clean Solution" 之后,应用程序可以正常运行大约 20-30 秒;控制器由 Unity 正确解析,解析器似乎正在完成它的工作。然后 NullReferenceException 被抛出,并且在应用程序的剩余生命周期中没有控制器被成功解析。重新运行应用程序(不先清理)会在第一次解析控制器时立即导致此错误。

如果您查看 UnityContainer..ctor(UnityContainer parent)code,唯一可能发生 NullReferenceException 的地方是这一行:

parent.lifetimeContainer.Add(this);

if (parent != null)里面,所以这里唯一可以为空的是parent.lifetimeContainerlifetimeContainerInitializeBuilderState 中初始化,这是从构造函数调用的,唯一设置它的其他地方是在 Dispose 方法中。

所以这个错误很可能是因为父容器已经被释放了。

这可能是 Unity 中的一个错误; CreateChildContainer 应该检查容器是否已经被处理,如果有则抛出 ObjectDisposedException