据我所知,DependencyResolver 是线程安全的,但是,运行以下代码会在后台线程中引发空引用异常。
public interface ITest {
}
public class Test : ITest {
}
//this works fine
var service = DependencyResolver.Current.GetService<ITest>();
var t1 = Task.Run(() => {
//This throws a Null Reference exception.
// note that DependencyResolver.Current is NOT null.
// The exception occurs in GetService
var s1 = DependencyResolver.Current.GetService<ITest>();
});
Task.WaitAll(t1);
这是堆栈跟踪:
at Unity.Mvc4.UnityDependencyResolver.get_ChildContainer()
at Unity.Mvc4.UnityDependencyResolver.IsRegistered(Type typeToCheck)
at Unity.Mvc4.UnityDependencyResolver.GetService(Type serviceType)
at System.Web.Mvc.DependencyResolverExtensions.GetService[TService](IDependencyResolver resolver)
at System.Threading.Tasks.Task.InnerInvoke()
at System.Threading.Tasks.Task.Execute()
我知道“服务定位器”模式是一种反模式。在这一点上,我只是想了解为什么这不起作用。
如有任何见解,我们将不胜感激。
谢谢!
最佳答案
从堆栈跟踪可以清楚地看出您正在使用 Unity.Mvc4 NuGet包,这是一些非官方的包,不是微软发布的。这个包包含一个错误。它的 UnityDependencyResolver.ChildContainer
属性调用 HttpContext.Current.Items
而不检查 HttpContext.Current
是否为 null,它会导致 NullReferenceException
当实例在 Web 请求的上下文之外解析时。
因此,与其使用非官方的 NuGet 包,我认为你最好使用 official NuGet package .
关于multithreading - Unity MVC GetService在后台线程抛出NullReferenceException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21681247/