2017-03-07 9 views
0

私はAutofacでcontrollerfactoryを作成したいが、私はこの行にnull参照インスタンスエラーがある: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がnullである...しかし、なぜですか?私は、溶液中のコントローラを持っている:

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項目のコントローラコンテキストがnullであることを意味しています!

enter image description here

+0

'ControllerContext'は、HTTPリクエスト中にのみ有効です。 – DavidG

+0

ブレークポイントでは、最初に 'contr.ControllerContext.RouteData.Values'を調べて何が入っているのかを見ることができます。第二に、あなたは二つの 'HomeController'を持っていますか? – HouseCat

+0

@RagingCainいいえ、2つありません...私は、foreach項目のブレークポイントとコントローラのコンテキストを検査しました.lstControllers "WebApplication1.Controllers.HomeController"には1つの項目しかありませんでしたが、コントローラコンテキストはnullです –

答えて

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

あなたはこの新しい情報に基づいて他の場所Controllersmapする必要があるとしています。

+0

TNX @Raging。私のコントローラの工場のクラスはそれとは違うので、あなたのソースは役に立ちませんでした。私は持っていないいくつかのプロパティを持っています。それは私のクラスと同じタイプのクラスを持っているようです。残念なことに複雑なサンプルはありません(コントローラ工場... icontroller工場またはデフォルトコントローラ工場)。私の検索によれば、すべての人が自分の解決策でこれを使用しています。イムはそれを完全に混乱させた –

関連する問題