[英]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
,則您所擁有的是正確的。 但是,如果您可以停止將控制器注冊為命名服務,則標准依賴關系解析管道將“正常運行”,並且您不需要所有額外的代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.