Autofac和ASP .NET MVC控制器中的生命周期范围不佳

时间:2015-06-19 12:41:36

标签: c# asp.net-mvc-4 autofac

我在另一个程序集(文件夹配置/扩展名)中有外部控制器(例如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))

1 个答案:

答案 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.