2017-03-07 100 views
0

我想創建一個帶有Autofac的controllerfactory,但是我在這一行中有空引用實例錯誤:string ctrName = contr.ControllerContext.RouteData.Values["Controller"].ToString()當我運行我的項目時。似乎沒有控制器被我的控制器工廠認可

這是我controller factory

internal class ControllerFactory : DefaultControllerFactory 
{ 
    private readonly Dictionary<string, Func<RequestContext, IController>> _controllerMap; 

    public ControllerFactory() 
    { 
     List<IController> lstControllers = DependencyResolver.Current.GetServices<IController>().ToList(); 
     _controllerMap = new Dictionary<string, Func<RequestContext, IController>>(); 

     foreach (Controller contr in lstControllers) 
     { 
      string ctrName = contr.ControllerContext.RouteData.Values["Controller"].ToString(); //iv got null instance error in this line 
      _controllerMap.Add(ctrName, c => contr); 
     } 
    } 

    public override IController CreateController(RequestContext requestContext, string controllerName) 
    { 

     if (_controllerMap.ContainsKey(controllerName)) 
     { 
      return _controllerMap[controllerName](requestContext); 
     } 
     else 
      throw new KeyNotFoundException(controllerName); 
    } 
} 

,這是我AppStart的:

 protected void Application_Start() 
    { 

     var builder = new ContainerBuilder(); 

     builder.RegisterControllers(typeof(MvcApplication).Assembly).AsImplementedInterfaces(); 

     builder.Register(s => new ControllerFactory()).As<IControllerFactory>(); 


     var container = builder.Build(); 
     DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 


     AreaRegistration.RegisterAllAreas(); 
     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
     BundleConfig.RegisterBundles(BundleTable.Bundles); 
    } 

錯誤原因很清楚:我的foreach項目ControllerContext是空......但是爲什麼呢?我有控制器在我的解決方案:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 

    public ActionResult About() 
    { 
     ViewBag.Message = "Your application description page."; 

     return View(); 
    } 

    public ActionResult Contact() 
    { 
     ViewBag.Message = "Your contact page."; 

     return View(); 
    } 

} 

更新:我檢查調試程序foreach..the項目類型爲WebApplication1.Controllers.HomeController表示正好我家的控制器,但MT項目的控制器上下文爲空!

enter image description here

+0

'ControllerContext'只在HTTP請求期間有效。 – DavidG

+0

斷點,所以你可以檢查'contr.ControllerContext.RouteData.Values'首先看看裏面有什麼。其次,你有兩個'HomeController'? – HouseCat

+0

@RagingCain沒有我沒有兩個...我檢查了斷點和foreach項目的控制器上下文爲空......並且在lstControllers「WebApplication1.Controllers.HomeController」中只有一個項目,但控制器上下文爲空 –

回答

1

這意味着您可以在哪些訪問 ControllerContext屬性是通過重寫執行或初始化 方法(但調用base.Execute或base.Initialize第一)的最早的點:

protected override void Execute(RequestContext requestContext) 
{ 
    base.Execute(requestContext); 

    // .ControllerContext is available from this point forward. 
} 

protected override void Initialize(RequestContext requestContext) 
{ 
    base.Initialize(requestContext); 

    // .ControllerContext is available from this point forward. 
} 

後者(初始化)是絕對最早點處你 可以使用ControllerContext屬性,除非您自己處理 指派,這是不推薦的(因爲 框架的部分將取決於該屬性當時分配給 )。

來源:Null ControllerContext in my custom controller inheriting from BaseController

你將不得不在其他地方在此基礎上新的信息mapControllers

+0

TNX @Raging。但是你的源對我沒有用處,因爲我的控制器工廠類不同於它,它有一些我沒有的屬性,它看起來不像我的類具有相同類型。不幸的是,在任何地方沒有任何關於(控制器工廠... icontroller工廠或默認控制器工廠..)的複雜示例。根據我的搜索,每個機構都通過自己的解決方案來使用它。即時通訊完全混淆了一回合 –