asp.net-mvc-3 - 带autofac的自定义 ControllerFactory

  显示原文与译文双语对照的内容

首先,我是mvc中的新手,所以请耐心等待。

目前我想创建 autofac,其中将是IoC容器我将reqister定制控制器工厂。 在自定义控制器工厂中,我希望通过控制器的构造函数设置实现数据存储库。

我认为应该以那样的方式完成:


ContainerBuilder builder = new ContainerBuilder();
 builder.RegisterControllers(asm).InstancePerHttpRequest();
 builder.Register(s => new ControllerFactory()).As<IControllerFactory>();
 IContainer container = builder.Build();

 DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

我的控制器工厂代码:


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();
 _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);
 }
}

控制器映射为空。当我想解析IController时,接收和错误是因为IController不是 reqiseter,但是我在autofac生成器中使用了 RegisterControllers 。

你能用正确的方式解释一下?

时间: 原作者:

由于通过接口解析控制器,因这里使用 AsImplementedInterfaces 方法对控制器进行 register 处理。


builder.RegisterControllers(asm).AsImplementedInterfaces()
. InstancePerHttpRequest();

原作者:
...