Unity注册错误涉及到我没有解决的类型

9
我有一个MVC4应用程序,它使用Unity进行依赖项解析。我们拥有一个日志记录器装饰器,专门用于在依赖项解析失败时记录日志。
我发现有大量类型无法解析,而我的应用程序并没有显式地解析这些类型。这些类型是:
IControllerFactory
IControllerActivator
IViewPageActivator
ModelMetadataProvider
ITempDataProvider
IActionInvoker
IAsyncActionInvoker

抛出的异常都是这样的:
类型“ITempDataProvider”没有可访问的构造函数。
...带有它们自己的类型。
这些异常仅在应用程序启动时发生,目前我们正在记录它们并继续运行。因此,在错误发生后,应用程序仍能正常运行。
我厌恶没有充分理由就吞噬错误,并且不理解首先是谁/什么试图解决这些错误,我没有足够的理由。
问题:
1)有人知道是谁/什么在试图解决这些问题吗?它不存在于我的代码库中。
2)如果在框架的某个地方尝试解决这些问题,是否期望我的应用程序会提供Unity的解决方法?
3)还是这只是预期的行为,我应该忽略这些异常?
我知道这样的信息很少,但我希望其他人也看到了这些错误并能指引我方向。
2个回答

8
您已经将Unity作为MVC中的DependencyResolver,是吗?您看到的所有类型都是MVC框架内部使用的,它(MVC)正试图解析它们。
底层的MVC代码会捕获错误,如果某些内容无法解析,则会回退到标准实现。这样做是为了插入自定义实现时有一个统一的方法。
您不需要对这些异常做任何处理 - 只需让它们流回给调用者,MVC会处理正确的事情。

我接受了这个答案,因为你澄清了这是预期的行为,这正是我想要的。谢谢,我很感激。 - Silas
我认为这个答案不准确。实际上,你需要捕获这个异常并返回null - Illidan
我已经为这个答案投了赞成票,但是我现在正在一个企业环境中工作。你能否提供一些文档来支持这个答案? - Thomas
我能做的最好的就是指向源代码 - 当前的MVC代码在github上,网址为https://github.com/aspnet/Mvc,旧版本在codeplex上,网址为http://aspnetwebstack.codeplex.com/。 - Chris Tavares

2
如果您通过Unity解析一个没有无参构造函数的类,Unity将递归尝试解析其中一个构造函数的参数类型,除非您明确告诉它不要这样做...如果失败了,您会得到像您看到的那些类型的错误,这些类型可能不是您直接解析的。因此,您很可能正在解析带有构造函数的YOUR类,该构造函数需要一个MVC类,该类本身具有构造函数参数,例如ModelMetaDataProvider等。
指定构造函数的示例:
<register type="IMyThing" mapTo="MyThing">
  <constructor>
    <param name="x" type="MyType1" />        
    <param name="y" type="MyType2" />
  </constructor>
</register>

这是一个非常有趣的想法 - 我需要去调查一下。我不认为情况是这样的 - 但是由于我们在这段代码中有很多统一配置,这肯定是可能的。我会回复你的,尽管这可能需要我花费一些时间来仔细检查我的代码。 - Silas
1
另外,你说:“Unity 会递归地尝试解析其中一个构造函数的参数类型,除非你明确告诉它不要这样做…”- 如何告诉 Unity 不要这样做? - Silas
1
在Unity配置中指定要使用的构造函数和要注入的值。已更新我的答案。 - Haney
1
谢谢,我会特别关注那部分代码,进行仔细审查。 - Silas
1
David,谢谢你的回答。它帮助我更好地理解了Unity的工作原理。然而,我将另一个标记为正确答案,因为它确实回答了我所寻找的内容。 - Silas
1
仅供将来参考,如果您遇到解析异常,请仔细查看异常中的错误消息。它包括对象图中出现问题的跟踪,包括参数名称。因此,您不必想知道在代码中无法解析时在哪里,错误消息会告诉您。 - Chris Tavares

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