【发布时间】:2017-03-07 13:53:34
【问题描述】:
我想用 Autofac 创建一个控制器工厂,但是我在运行我的项目时在这一行出现空引用实例错误: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);
}
}
这是我的应用启动:
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 上检查了调试器。项目类型为 WebApplication1.Controllers.HomeController 意味着正是我的主控制器,但 mt 项目的控制器上下文为空!!!
【问题讨论】:
-
ControllerContext仅在 HTTP 请求期间有效。 -
断点,因此您可以首先检查
contr.ControllerContext.RouteData.Values以查看其中的内容。其次,你有两个HomeController吗? -
@RagingCain 不,我没有两个...我检查了断点,并且 foreach 项目的控制器上下文为空.. lstControllers“WebApplication1.Controllers.HomeController”中只有一个项目,但控制器上下文其中为空
-
@ImanSalehi 您能否添加该对象属性的屏幕截图,可能是“控制器”是引用该对象的无效键。也许它应该是“家”。控制器有一些自动映射的魔力。
-
@RagingCain i.stack.imgur.com/SYyjQ.jpg
标签: c# asp.net-mvc autofac controller-factory