项目
版本

请求的服务未注册

示例信息

请求的服务 MyApp.IMyDependency 未在容器/生命周期作用域中注册。要避免此异常,请使用以下方法之一来解决服务:注册一个组件以提供服务;使用 IsRegistered() 方法检查服务注册情况;或使用 ResolveOptional() 方法来解决可选依赖。

这个错误意味着 Autofac 尝试根据应用程序请求解析服务,但该服务并未在容器/生命周期作用域中注册。消息指出了无法找到的服务。例如,在上面的示例中,未在生命周期作用域中找到 MyApp.IMyDependency 服务。

故障排除

重要的是要记住服务组件之间的区别:服务是正在被暴露的接口或类,而组件则是为了实现该服务而创建的具体类。

在这样的注册中...

builder.RegisterType<MyComponent>().As<IMyService>();

...MyComponent组件,而 IMyService服务

异常告诉您哪个 服务 未找到。查看堆栈跟踪,您应该能够看到应用程序中试图解析该服务的代码。这可能出现在更长的解决链路中,例如当您有一个构造函数需要 IMyService 的对象,并尝试解析该对象时。

这个问题的常见原因是注册遗漏。 确保已注册服务。尤其是使用 程序集扫描 时,容易忽略某些内容。

还可能发生更微妙的问题,即具有相似名称但不同命名空间的 服务 可能已注册。例如,如果您的应用程序有 FirstNamespace.IMyServiceSecondNamespace.IMyService,在类文件顶部添加一些 using 语句并注册 IMyService,可能没有意识到实际注册了哪个服务。代码看起来像是正确注册的,但实际上并非如此。

同样罕见的是,这可能发生在动态加载程序集并扫描依赖项的“插件系统”中:两个不同的程序集可能具有相同的命名空间和接口名称。实际上注册的是哪个?

最后,如果您使用 AnyConcreteTypeNotAlreadyRegisteredSource 来节省时间,可能会意外地将容器中不需要注册或不使用的项自动包含进来。这些额外的项也可能实现您试图解析的接口,因此在解析服务时,由于缺少依赖项,它会生成此类错误,这可能会非常令人困惑。尝试移除 ACTNARS 使用,更明确地注册组件,可能使用程序集扫描代替。

在本文档中