ASP .Net MVC 2自定义控制器工厂被调用两次,第二次controllerType为null

时间:2011-11-10 23:48:22

标签: c# asp.net-mvc-2 dependency-injection structuremap

我创建了一个自定义控制器工厂,以便能够使用StructureMap将服务实例注入我的控制器。

一切正常,但每个请求都会在第一次调用控制器工厂时正确地解析控制器,第二次调用controllerType参数为null,因此StructureMap的GetInstance方法抛出ArgumentNullException:值不能是空的。参数名称:key。

应用程序实际上没有崩溃但是如果我正在调试它总是停在那里我必须手动继续执行以便显示视图。

有谁能解释为什么会这样,我该怎么解决呢。

以下是我的Global.asax和控制器工厂的代码:

控制器工厂:

public class IocControllerFactory : DefaultControllerFactory
{
    private readonly IContainer container;

    public IocControllerFactory(IContainer container)
    {
        if(container == null) throw new ArgumentNullException("container");
        this.container = container;
    }

    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {
        return this.container.GetInstance(controllerType) as IController;
    }
}

Global.asax中

private void RegisterControllerFactory()
{
    var ioc = new Container();

    var controllerFactory = new IocControllerFactory(ioc);
    ControllerBuilder.Current.SetControllerFactory(controllerFactory);

    ioc.Configure(r => 
        r.Scan(x =>
        {
            x.AssemblyContainingType<UserAccountController>();
            x.AddAllTypesOf<IController>();
            x.Include(t => typeof(IController).IsAssignableFrom(t));
        }
    ));

    ioc.Configure(r => r
        .For<IUserAccountService>()
        .Use<UserAccountService>());
}

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

请记住,ASP.NET MVC会使用默认配置通过控制器工厂查找未映射到文件的每个请求。大多数浏览器默认请求favicon.ico文件。所以,正在发生的事情是你的favicon被调用但是没有映射到一个类型,所以StructureMap得到一个null类型并且错误输出。

最简单的修复方法是添加favicon.ico文件或为路线添加忽略。