我有一个使用Unity进行依赖性解析的MVC4应用程序。我们拥有的一件事是Unity容器的记录器装饰器 - 仅用于在任何依赖项解析失败时进行记录。
我发现有很多类型无法解决我的应用未明确解决的问题。这些类型是:
IControllerFactory
IControllerActivator
IViewPageActivator
ModelMetadataProvider
ITempDataProvider
IActionInvoker
IAsyncActionInvoker
抛出的异常都是这样的:
类型ITempDataProvider
没有可访问的构造函数。
......有自己的类型。
这些例外仅在应用程序启动时发生,现在我们正在记录它们并继续。因此,即使发生错误,应用程序也能正常运行。
我讨厌在没有充分理由的情况下吞咽错误,并且在没有理解试图解决这些错误的原因时,我没有充分的理由。
问题:
1)有谁知道是谁/什么试图解决这些问题?它不在我的代码库中的任何地方。 2)如果在框架中某处试图解决这些问题,我的应用程序是否会在Unity中为这些提供解决方案? 3)或者这只是预期的行为,我应该吞下这些例外吗?
我知道这不是很多,但我希望其他人看到这些类型的错误,并能指出我正确的方向。
答案 0 :(得分:7)
你已经将Unity作为MVC中的DependencyResolver连接起来,对吗?您所看到的所有类型都是由MVC框架本身在内部使用的,而它(MVC)正试图解决它们。
如果某些内容无法解决并退回到标准实现,则引擎盖下的MVC代码会捕获错误。这样做是为了有一个统一的方法来插入这些东西的自定义实现,如果你需要它们。
你不应该对这些异常做任何事情 - 让它们流回调用者,MVC会做正确的事。
答案 1 :(得分:2)
如果您通过Unity解决了没有无参数构造函数的类,Unity会递归尝试解析其中一个构造函数的参数类型,除非您明确告诉它不要......如果失败,您将获得您可能没有直接解决的类型之类的错误。所以很可能你正在解析你的类,它有一个构造函数,它接受一个MVC类,它本身有构造函数参数,如ModelMetaDataProvider
等。
指定构造函数的示例:
<register type="IMyThing" mapTo="MyThing">
<constructor>
<param name="x" type="MyType1" />
<param name="y" type="MyType2" />
</constructor>
</register>