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.lifetimeContainer
。 lifetimeContainer
在 InitializeBuilderState
中初始化,这是从构造函数调用的,唯一设置它的其他地方是在 Dispose
方法中。
所以这个错误很可能是因为父容器已经被释放了。
这可能是 Unity 中的一个错误; CreateChildContainer
应该检查容器是否已经被处理,如果有则抛出 ObjectDisposedException
。
我们有一个使用 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.lifetimeContainer
。 lifetimeContainer
在 InitializeBuilderState
中初始化,这是从构造函数调用的,唯一设置它的其他地方是在 Dispose
方法中。
所以这个错误很可能是因为父容器已经被释放了。
这可能是 Unity 中的一个错误; CreateChildContainer
应该检查容器是否已经被处理,如果有则抛出 ObjectDisposedException
。