我在另一个程序集(文件夹配置/扩展名)中有外部控制器(例如ExtController)。
注册:
builder.RegisterControllers(assembly).Named<IController>(t =>
t.Name.Replace("Controller", string.Empty)
);
获取控制器(我有自己的控制器工厂):
public override IController CreateController
(System.Web.Routing.RequestContext requestContext, string controllerName)
{
try
{
var ctrl = _base.CreateController(requestContext, controllerName);
return ctrl;
}
catch (HttpException htte)
{
Object ic = null;
if (_container.TryResolveNamed(controllerName, typeof(IController), out ic))
{
return ic as IController;
}
else
throw htte;
}
}
如果我对这个控制器做出请求,我会得到&#34; root&#34; autofac生命周期范围。 在其他控制器中我得到了&#34; AutofacWebrequest&#34;范围。
你可以帮帮我吗?也许是从另一个程序集创建控制器的另一种方法?修改
我解决了我的问题,但我认为这不是我能做到的最佳方式。 我改变了:
if (_container.TryResolveNamed(controllerName, typeof(IController), out ic))
到:
if ( (DependencyResolver.Current as Autofac.Integration.Mvc.AutofacDependencyResolver).RequestLifetimeScope.TryResolveNamed(controllerName, typeof(IController), out ic))
答案 0 :(得分:0)
不幸的是,如果您的集成点是针对命名服务的自定义控制器工厂,那么您可能会对所拥有的内容感到困惑。您可以使用AutofacDependencyResolver.Current
而非投射{{1}你自己,但原则仍然是一样的。
但是,我确实注意到你没有显示基本ControllerFactory是什么。看起来你有一种装饰模式,而DependencyResolver.Current
被调用而不是_base
(没有下划线)。 base
已通过依赖项解析程序运行控制器实例化。当然,这意味着您需要不将控制器注册为命名的服务,而只需使用标准DefaultControllerFactory
方法注册它们。
同样,如果你必须注册它们(无论出于何种原因)和/或如果对RegisterControllers
的基本调用没有通过标准CreateController
,那么你拥有的是正确。但是,如果您可以停止将控制器注册为命名服务,那么标准的依赖关系解析管道将会“正常工作”。你不会需要所有额外的代码。
There is detailed documentation on Autofac MVC integration on the Autofac doc site.