簡體   English   中英

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

[英]Autofac and ASP .NET MVC bad lifetime scope in controller

我在另一個程序集(文件夾config / extensions)中有外部控制器(例如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;
     }             
 }

而且,如果我對此控制器提出要求,則會獲得“ root” 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 ,但是原理仍然是相同的。

但是,我確實注意到您沒有顯示基本的ControllerFactory。 看來您有一種裝飾器模式,其中_base被調用而不是base (不帶下划線)。 DefaultControllerFactory已通過依賴關系解析器運行控制器實例化。 當然,這將意味着你需要注冊控制器作為命名服務,而是只與標准注冊它們RegisterControllers方法。

再次,如果您必須注冊它們的名稱(無論出於何種原因)和/或如果對CreateController的基本調用沒有通過標准DefaultControllerFactory ,則您所擁有的是正確的。 但是,如果您可以停止將控制器注冊為命名服務,則標准依賴關系解析管道將“正常運行”,並且您不需要所有額外的代碼。

在Autofac doc網站上有有關Autofac MVC集成的詳細文檔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM