9

我有一个使用 Unity 进行依赖解析的 MVC4 应用程序。我们拥有的东西之一是 Unity 容器的记录器装饰器 - 其唯一目的是在任何依赖解析失败时进行记录。

我发现有大量类型无法解析,而我的应用程序没有明确解析。这些类型是:

IControllerFactory
IControllerActivator
IViewPageActivator
ModelMetadataProvider
ITempDataProvider
IActionInvoker
IAsyncActionInvoker

抛出的异常都是这样的:

该类型ITempDataProvider没有可访问的构造函数。

...有自己的类型。

这些异常仅在应用程序启动时发生,现在我们正在记录它们并继续。因此,即使发生错误,应用程序也能正常运行。

我讨厌在没有充分理由的情况下吞下错误,并且不了解首先尝试解决这些问题的方法,我没有充分的理由。

问题:

1)有谁知道谁/什么试图解决这些问题?它不在我的代码库中的任何地方。2)如果在框架中的某个地方试图解决这些问题,我的应用程序是否会在 Unity 中为这些问题提供解决方案?3)或者这只是预期的行为,我应该吞下这些异常?

我知道这不是很多事情要做,但我希望其他人已经看到了这些类型的错误,并且能够为我指出正确的方向。

4

2 回答 2

8

您已经将 Unity 连接为 MVC 中的 DependencyResolver,对吗?您看到的所有这些类型都是 MVC 框架本身在内部使用的,它 (MVC) 是试图解决它们的原因。

如果某些事情无法解决并回退到标准实现,则引擎盖下的 MVC 代码会捕获错误。这样做是为了有一种统一的方法来插入这些东西的自定义实现,如果你想要的话。

你不应该对这些异常做任何事情——只要让它们流回调用者,MVC 就会做正确的事情。

于 2013-08-29T22:38:54.707 回答
2

如果您通过 Unity 解析一个没有无参数构造函数的类,Unity 将递归尝试解析其中一个构造函数的参数类型,除非您明确告诉它不要... 如果失败,您将收到错误,例如你看到的那些你可能没有直接解决的类型。因此,您可能正在解析您的类,该类具有一个构造函数,该构造函数采用一个 MVC 类,该类本身具有构造函数参数,例如ModelMetaDataProvider等。

指定构造函数的示例:

<register type="IMyThing" mapTo="MyThing">
  <constructor>
    <param name="x" type="MyType1" />        
    <param name="y" type="MyType2" />
  </constructor>
</register>
于 2013-08-29T19:15:09.190 回答