Unity容器的Resolve<T>方法会抛出错误,声称它不能与类型参数一起使用。

77

昨天我实现了这段代码:

CustomerProductManager productsManager = container.Resolve<CustomerProductManager>();

原本代码可以编译和运行。

今天(可能修改了一些东西),我不断地收到以下错误:

The non-generic method 'Microsoft.Practices.Unity.IUnityContainer.Resolve(System.Type, string, params Microsoft.Practices.Unity.ResolverOverride[])' cannot be used with type arguments

我的同事有相同的源代码,但没有同样的错误。为什么?如何解决这个问题?

P.S.

导入部分已包含 "using Microsoft.Practices.Unity;"。

我尝试使用非泛型版本替换泛型版本:

CustomerProductManager productsManager = (CustomerProductManager)container.Resolve(typeof(CustomerProductManager));

出现了另一个错误:

没有重载方法“Resolve”接受'1'个参数

看起来好像其中一个程序集没有被引用...但是是哪一个呢?我已经引用了两个程序集: 1. Microsoft.Practices.Unity.dll 2. Microsoft.Practices.ServiceLocation.dll

P.S. 我曾经看到类似的问题http://unity.codeplex.com/WorkItem/View.aspx?WorkItemId=8205,但它被解决为“不是错误”

任何想法都会有所帮助


你正在使用Unity 2.0吗? - Vadim
3
你可能发现,是“Power Commands”插件在删除未使用的命名空间引用;当你的代码处于无法编译的状态,而你又习惯在编辑期间保存文件时,“unused”命名空间就会出现,这时插件会在保存时删除多余的引用。 - Curt Nichols
5个回答

176

我曾经遇到过同样的问题,并从Prism示例代码文件中找到了“修复”方法。 看起来,即使在Unity V2中它不是dll,您也必须在类中添加对以下引用的引用: Microsoft.Practices.Unity

我的完整“using”部分如下:

using System;
using System.Windows;
using Microsoft.Practices.Composite.Modularity;
using Microsoft.Practices.Unity;
using Microsoft.Practices.Composite.UnityExtensions;

我不确定您是否正在使用Silverlight,但Container.Resolve的通用版本确实在Microsoft.Practices.Unity中。


9
没错。 我之前发现添加 'using Microsoft.Practices.Unity;' 可以解决一个问题。 - Budda
1
这对我也起作用了,但该死的resharper现在抱怨未使用的“using指令”。 - IbrarMumtaz
6
之所以这样做是因为带有类型参数的Resolve是在Microsoft.Practices.Unity中找到的扩展方法,而不带类型参数的Resolve()只是接口(或类)上的一个方法。 - Geoff
1
谢谢!所有这些年过去了,这刚刚发生在全新的代码上。HttpClient 也是这种“隐藏”的扩展机密方式。我不是粉丝。我喜欢 Simple Injector。 - TheDev6
12
顺便说一句,在新的、据称高度兼容的 Unity 5 中,命名空间现在是 Unity 而不是 Microsoft.Practices.Unity - Ken Smith
显示剩余3条评论

49

微软不再拥有Unity引擎,当前版本为5,命名空间已更改为:

using Unity;

在使用时,请确保它位于您的“using”部分中:

container.Resolve<T>();

1
请注意,如果您正在使用Prism,则当前稳定版本(6.3.0)的Prism仍然使用Unity 4.0.1,在其中仍需使用“using Microsoft.Practices.Unity;”。 - Ray
真的,这个问题让我抓狂了。谢谢! - str8ball

1
我遇到了这个问题,但这些答案都没帮到我。 我在编译时收到如下错误信息:

Microsoft.Practices.Unity.IUnityContainer 的 RegisterType() 方法未知。

这是我代码中的一部分:

Container.RegisterType<IMyInterface, MyClass>();

我发现如果你没有在 MyClass 类中实现 IMyInterface 接口,就会出现此问题。 希望这对您也有所帮助 ...


0
在我的情况下,我正在使用Unity包装的类继承自一个抽象基类,而该基类没有无参构造函数。一旦我将代码更改为使用基类的无参构造函数,问题就消失了。

0
在我的情况下,我使用了Bootstrapper实现自己的Resolve而没有使用通用版本,因此它无法找到Microsoft的Unity Resolve。添加正确的using语句解决了这个问题。

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