Asp.net mvc 3 带有autofac的自定义控制器工厂

Asp.net mvc 3 带有autofac的自定义控制器工厂,asp.net-mvc-3,dependency-injection,autofac,controller-factory,Asp.net Mvc 3,Dependency Injection,Autofac,Controller Factory,首先,我是asp mvc的新手,所以请耐心等待 目前我想创建一个项目,其中autofac将是IoC容器,我将重新注册自定义控制器工厂。在自定义控制器工厂中,我希望通过控制器的构造函数设置实现数据存储库 我认为应该这样做: ContainerBuilder builder = new ContainerBuilder(); builder.RegisterControllers(asm).InstancePerHttpRequest(); builder.Regis

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

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

我认为应该这样做:

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

        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
ContainerBuilder=newcontainerbuilder();
builder.RegisterController(asm.InstancePerHttpRequest();
注册(s=>newcontrollerfactory()).As();
IContainer容器=builder.Build();
SetResolver(新的AutofacDependencyResolver(容器));
我的控制器出厂代码:

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);
    }
}
内部类ControllerFactory:DefaultControllerFactory
{
专用只读字典\u controllerMap;
公共控制器工厂()
{
List lstControllers=dependencysolver.Current.GetServices().ToList();
_controllerMap=新字典();
foreach(LST控制器中的控制器控制)
{
字符串ctrName=CONTROL.ControllerContext.RouteData.Values[“Controller”].ToString();
_controllerMap.Add(ctrName,c=>contr);
}
}
公共重写IController CreateController(RequestContext RequestContext,string controllerName)
{
如果(_controllerMap.ContainsKey(controllerName))
{
返回_controllerMap[controllerName](requestContext);
}
其他的
抛出新的KeyNotFoundException(controllerName);
}
}
控制器映射为空。当我想要解析IController时,我收到并出错,因为IController不是Requister,但我在autofac builder中使用了RegisterController


您能解释一下如何正确执行吗?

由于您是通过接口解析控制器,请使用
AsImplementedInterfaces
方法注册控制器

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

谢谢你的回答。它解决了我所有的问题。即使在autofac wiki上的示例中也没有这样的示例。
InstancePerHttpRequest
已过时。您只需使用
InstancePerRequest