我想創建一個帶有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項目的控制器上下文爲空!
'ControllerContext'只在HTTP請求期間有效。 – DavidG
斷點,所以你可以檢查'contr.ControllerContext.RouteData.Values'首先看看裏面有什麼。其次,你有兩個'HomeController'? – HouseCat
@RagingCain沒有我沒有兩個...我檢查了斷點和foreach項目的控制器上下文爲空......並且在lstControllers「WebApplication1.Controllers.HomeController」中只有一個項目,但控制器上下文爲空 –