2013-02-26 56 views
0

我认为我知道很多关于Unity的知识,但以下情况除外。 I'm使用Unity容器注册我的棱镜意见,像这样有一个名为准对象:使用命名注册解析实例不会抛出异常

_unityContainer.RegisterType<object, MyDummyView>("MyDummyViewName"); 

,我通过调用

object view = _unityContainer.Resolve<object>("MyDummyViewName"); 

到目前为止好请求视图的实例。现在我在我的系统中发现了一个错误,因为我使用了错误的名称来解析一个视图的实例,并且我期望Unity抛出一个异常。

object view = _unityContainer.Resolve<object>("MyWrongDummyViewName"); 

但团结不抛出任何异常(如ResolutionFailedExceptionActivationException)。当我执行上面的调用时,它将返回一个新的object,而不注册具有给定(错误)名称的任何视图。

这是Unity的正确行为吗?我真的希望在这里得到一个例外。在Prism的范围内,这是一个问题,因为在导航到错误的目标(视图)期间,我不会得到任何异常。

回答

1

我和你在一起,这是意想不到的行为。我认为这个问题起源于你试图解决一个具体类的实例(在你的案例object)。 Unity看起来总是试图解决这个问题。只要它能做到这一点,它将忽略命名映射。

我尝试了一个基类(ViewBase),除非你声明它为abstract,否则容器也会解析它。这样做会引起预期的例外。

如果您引入了一个接口或抽象基类来解决您的问题。

您应该打开一个bug ticket for Unity

+0

感谢您的回答。问题是[棱镜基本区域导航](http://msdn.microsoft.com/en-us/library/gg430861(v = pandp.40).aspx#sec8)需要将我的视图注册为对象。否则导航基础结构不能解析视图 – Jehof 2013-02-26 11:39:33

+0

这是设计行为 - Unity将尝试解析未注册的具体类。由于没有注册(对象,“WhateverName”)它新增了一个对象实例。这不是最佳的,但这并不奇怪。 – 2013-02-27 07:55:16

+0

@ChrisTavares Unity已经在尝试解决具体类的事实是已知的(我记录在案,我相信)。但是它忽略了一个明确指定的映射名称......这与Unity的行为有所不同,当询问一个接口时,至少对我而言*是令人惊讶的。 – 2013-03-01 05:55:46