值不能为空。参数名称:尝试解析 class 时的上下文
Value cannot be null. Parameter name: context when trying to resolve a class
我已经使用 Autofac 一段时间了,它运行得非常完美。
我最近想在另一个项目中实现它时,我立即遇到了一个异常,我不知道它为什么会出现,也不知道它可能源于哪里。
System.ArgumentNullException: "Value cannot be null. Parameter name:
context"
Autofac.ResolutionExtensions.ResolveService(IComponentContext context, Service service, IEnumerable`1 parameters)
Autofac.ResolutionExtensions.Resolve(IComponentContext context, IEnumerable`1 parameters)
Autofac.ResolutionExtensions.Resolve(IComponentContext context)
AssetManagement.App.Test.Main(String[] args) in Test.cs: line: 24
System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
System.Threading.ThreadHelper.ThreadStart_Context(Object state)
System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
System.Threading.ThreadHelper.ThreadStart()
App.cs:
public class Test
{
public static void Main(string[] args)
{
var scheduledJob = Startup.Container.Resolve<IScheduledJob>(); // Exception on this line
}
}
Startup.cs:
internal static class Startup
{
public static IContainer Container { get; private set; }
public static void Run()
{
var builder = new ContainerBuilder();
builder.RegisterType<Test.ScheduledJobTest>().As<IScheduledJob>();
Container = builder.Build();
}
}
奇怪的是,无论我是否在 Startup
中注册了任何组件,我都会收到此异常。
另一个奇怪的事情是,无论 class 我试图解决哪个问题,我都会收到错误消息。
同样的错误提示如下:
var scheduledJob = Startup.Container.Resolve<Exception>();
堆栈跟踪中的 Resolve
方法是 IComponentContext
接口上的扩展方法。在 ResolveService
方法中进行检查以确保扩展方法的目标实际上不是 null
。在您的情况下,Container
属性 必须是 null
并且可能尚未初始化,因为没有调用静态 Run
方法。
我认为这只是一些用于测试某些东西的快速尖峰代码,但如果你进一步使用它,你应该尽量避免持有对容器的静态引用,因为它会鼓励 Service Locator
anti-pattern.
我已经使用 Autofac 一段时间了,它运行得非常完美。
我最近想在另一个项目中实现它时,我立即遇到了一个异常,我不知道它为什么会出现,也不知道它可能源于哪里。
System.ArgumentNullException: "Value cannot be null. Parameter name: context"
Autofac.ResolutionExtensions.ResolveService(IComponentContext context, Service service, IEnumerable`1 parameters)
Autofac.ResolutionExtensions.Resolve(IComponentContext context, IEnumerable`1 parameters)
Autofac.ResolutionExtensions.Resolve(IComponentContext context)
AssetManagement.App.Test.Main(String[] args) in Test.cs: line: 24
System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
System.Threading.ThreadHelper.ThreadStart_Context(Object state)
System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
System.Threading.ThreadHelper.ThreadStart()
App.cs:
public class Test
{
public static void Main(string[] args)
{
var scheduledJob = Startup.Container.Resolve<IScheduledJob>(); // Exception on this line
}
}
Startup.cs:
internal static class Startup
{
public static IContainer Container { get; private set; }
public static void Run()
{
var builder = new ContainerBuilder();
builder.RegisterType<Test.ScheduledJobTest>().As<IScheduledJob>();
Container = builder.Build();
}
}
奇怪的是,无论我是否在 Startup
中注册了任何组件,我都会收到此异常。
另一个奇怪的事情是,无论 class 我试图解决哪个问题,我都会收到错误消息。
同样的错误提示如下:
var scheduledJob = Startup.Container.Resolve<Exception>();
堆栈跟踪中的 Resolve
方法是 IComponentContext
接口上的扩展方法。在 ResolveService
方法中进行检查以确保扩展方法的目标实际上不是 null
。在您的情况下,Container
属性 必须是 null
并且可能尚未初始化,因为没有调用静态 Run
方法。
我认为这只是一些用于测试某些东西的快速尖峰代码,但如果你进一步使用它,你应该尽量避免持有对容器的静态引用,因为它会鼓励 Service Locator
anti-pattern.