使用DependencyResolver在MVC 3中实例化控制器时出现错误

4

我正在使用MVC 3,并在应用程序启动时使用以下代码...

UnityContainer container = new UnityContainer();

new UnityMappings(container);

DependencyResolver.SetResolver(new UnityServiceLocator(container));

现在应用程序运行时,有时会出现以下错误信息...

尝试获取类型 IControllerFactory、关键字 "" 的实例时发生激活错误

有趣的是,如果继续进行网络请求,网站可以正常工作。

有什么想法吗?我看不出自己与之前顺利运行时有什么不同之处。

谢谢,伊恩。


你是在 global.asax 中创建容器还是使用 WebActivator?另外,你使用的是哪个 Web 服务器?IIS、IISExpress 还是 VS Dev 服务器/Cassini? - Johan Danforth
上面的代码正在从Application_Start()方法中调用运行。 - Ian Warburton
哦,亲爱的...又来了...尝试获取类型ModelMetadataProvider的实例时发生激活错误,键为“”。 - Ian Warburton
这似乎是一个环境问题,因为在另一台机器上没有抛出异常。 - Ian Warburton
2个回答

6
MVC3从DependencyResolver中请求的东西不仅仅是控制器。如果DependencyResolver没有返回实例,MVC3会在大多数情况下回退到默认实现。

在您的情况下,它请求未知于您的IoC容器的IControllerFactory,然后抛出异常,由UnityServiceLocator实现捕获并返回null。MVC然后回退到默认控制器工厂。

与其他IoC容器不同,Unity不提供可选的TryResolve,因此不支持基于异常的DependencyResolver的正确实现。


嗨Rmo!这段代码以前在我这里运行过,没有抛出这个异常。而且,我不明白它为什么会回退到默认的控制器工厂,因为它将自定义构造函数参数传递给控制器(这些参数由Unity提供)。 - Ian Warburton
MVC3的默认控制器工厂实现使用DependencyResolver获取控制器。几乎每个人都使用默认的控制器工厂。正如您所说,您的应用程序可以工作。只是有一个问题,就是会抛出异常并被缓存,然后使用备用方案。 - Remo Gloor
那么,相对于其他环境,你认为是什么导致这些异常被抛出的呢? - Ian Warburton
3
根据你提供的少量信息,听起来你只在调试器中看到了错误,这是由于VS(Ctrl-Alt-E)中的异常设置造成的。请在“Thrown”列中清除所有复选标记。这个异常很可能在每个系统上都会发生,并且在每个系统上都被捕获。 - Remo Gloor
除了“用户处理的CLR异常”之外,所有内容都已取消选中。取消选中它似乎起作用了!谢谢。 - Ian Warburton

0
我建议首先查看配置文件,确保一切都正确,然后确保项目中引用了Unity所需的所有程序集。根据我的经验,该错误信息可能指向配置错误或缺少DLL,也许是您想要在容器中加载的程序集或Unity加载的另一个DLL所需的DLL?
希望这可以帮助到您。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接