C# 控制器中的Autofac和ASP.NET MVC错误生存期范围

C# 控制器中的Autofac和ASP.NET MVC错误生存期范围,c#,asp.net-mvc-4,autofac,C#,Asp.net Mvc 4,Autofac,我在另一个程序集中(文件夹配置/扩展)有外部控制器(例如ExtController) 注册: builder.RegisterControllers(assembly).Named<IController>(t => t.Name.Replace("Controller", string.Empty) ); 如果我请求这个控制器,我会得到“根”autofac生存期范围。 在其他控制器中,我得到了“AutofacWebrequest”范围 你能帮我吗?也许是从另一个程

我在另一个程序集中(文件夹配置/扩展)有外部控制器(例如ExtController)

注册:

builder.RegisterControllers(assembly).Named<IController>(t => 
    t.Name.Replace("Controller", string.Empty)
);
如果我请求这个控制器,我会得到“根”autofac生存期范围。 在其他控制器中,我得到了“AutofacWebrequest”范围

你能帮我吗?也许是从另一个程序集创建控制器的另一种方法

编辑

我解决了我的问题,但我认为这不是我能做到的最好的方法。 我从:

if (_container.TryResolveNamed(controllerName, typeof(IController), out ic))
致:

if ( (DependencyResolver.Current as Autofac.Integration.Mvc.AutofacDependencyResolver).RequestLifetimeScope.TryResolveNamed(controllerName, typeof(IController), out ic))

不幸的是,如果您的集成点是一个针对命名服务工作的自定义控制器工厂,您可能会被困在现有的环境中。您可以使用
AutofacDependencyResolver.Current
而不是自己铸造
DependencyResolver.Current
,但原理仍然相同

但是,我注意到您没有显示基本控制器工厂是什么。似乎您有一种装饰器模式,可以调用
\u base
,而不是
base
(不带下划线)。
DefaultControllerFactory
已经通过依赖项解析器运行控制器实例化。当然,这意味着您不需要将控制器注册为命名服务,而只需使用标准的
RegisterControllers
方法注册它们

同样,如果您必须以名称注册它们(无论出于何种原因),并且/或者如果对
CreateController
的基本调用没有通过标准
DefaultControllerFactory
,那么您所拥有的是正确的。但是,如果您可以停止将控制器注册为命名服务,那么标准依赖项解析管道将“正常工作”,您不需要所有额外的代码

if ( (DependencyResolver.Current as Autofac.Integration.Mvc.AutofacDependencyResolver).RequestLifetimeScope.TryResolveNamed(controllerName, typeof(IController), out ic))