C# 控制器中的Autofac和ASP.NET MVC错误生存期范围
我在另一个程序集中(文件夹配置/扩展)有外部控制器(例如ExtController) 注册: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”范围 你能帮我吗?也许是从另一个程
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))