IUnityContainer.Resolve<T> throws error claiming it cannot be used with type parameters
Asked Answered
L

5

77

Yesterday I've implemented the code:

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

It was compilable and working.

Today (probably I've modified something) I am constantly getting the error:

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

My collegue has the same source code and doesn't have same error. Why? How to resolve the problem?

P.S.

line "using Microsoft.Practices.Unity;" is present in usings section.

I've tried to replace generic version with non-generic one:

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

And got another error:

No overload for method 'Resolve' takes '1' arguments

It seems like one of the assemblies is not referenced.. but which one? I have 2 of them referenced: 1. Microsoft.Practices.Unity.dll 2. Microsoft.Practices.ServiceLocation.dll

P.P.S. I've saw similar problem http://unity.codeplex.com/WorkItem/View.aspx?WorkItemId=8205 but it is resolved as "not a bug"

Any thought will be helpful

Lugsail answered 20/5, 2010 at 15:46 Comment(2)
Are you using Unity 2.0?Selfcontradiction
You'll probably find that it's the Power Commands add-on that's removing unused namespace using clauses; the namespace is "unused" when your code is in an uncompilable state and you probably have a habit of saving the file during editing--and the add-on removes the extra uses when saving.Althaalthea
I
176

I had the same problem and found the "fix" looking at Prism sample code files. Looks like, even if it is not a dll in Unity V2 you have to add a reference in your class to: Microsoft.Practices.Unity

my complete "using" section is as follow

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

I'm not sure if you are using Silverlight, but the generic version for Container.Resolve IS in Microsoft.Practices.Unity.

Insignificancy answered 28/7, 2010 at 15:23 Comment(8)
Exactly. Some time ago I've detected that adding 'using Microsoft.Practices.Unity;' resolves an issue.Lugsail
This worked me also, but damn resharper is now moaning about unused 'using directives.'Clifford
The reason is that Resolve with a type parameter is an extension method found in Microsoft.Practices.Unity, while the Resolve() without a type parameter is just a method on the interface (or class).Carlson
Thx! All these years later and this just happened on brand new code. HttpClient is the same way with these 'hidden' extension secrets. Not a fan. I like Simple Injector.Battleplane
Worked for me. Weird thing was I could go to the definition fine but the using statement wasn't there.Sentry
And FWIW, in the new and supposedly highly compatible Unity 5, the namespace is now Unity and not Microsoft.Practices.Unity.Kaspar
Thx Ken, you saved me a ton of time trying to track this down. Upgraded my Unity nuget package and this no longer worked until just changing to using Unity like you mentionedElectroshock
Thanks, I was totally confused with - Resolve(Type type, string name, params ResolverOverride[] overrides)Histopathology
R
49

Microsoft no longer owns Unity and it's in version 5, the namespace is now:

using Unity;

Ensure that is in your using section when using:

container.Resolve<T>();
Rives answered 28/3, 2018 at 22:38 Comment(2)
Note that in case you're using Prism, the current stable version (6.3.0) of Prism still uses Unity 4.0.1, where you still have to using Microsoft.Practices.Unity;Emmittemmons
Seriously, this one was driving me nuts. Thanks!Mumble
H
1

I faced this problem and none of this answers did not help me. I was getting the compile time error

Unknown method RegisterType() of Microsoft.Practices.Unity.IUnityContainer

for my below code.

Container.RegisterType<IMyInterface, MyClass>();

I found that if you did not implement IMyInterface to the class MyClass, you get this issue. Hope it resolves for you too...

Hierodule answered 9/12, 2013 at 23:51 Comment(0)
R
0

In my situation the class I was wrapping with Unity inherited from an abstract base class, and that base class did NOT have a parameterless constructor. Once I changed my code to use a parameterless constructor for the base class, the problem disappeared.

Racialism answered 10/10, 2013 at 17:21 Comment(0)
B
0

In my situation, I had Bootstrapper implement its own Resolve without the generic version, so it couldn't find the Microsoft's Unity Resolve. Adding the proper usings did the trick.

Bahaism answered 31/5, 2016 at 16:16 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.