IUnityContainer.Resolve <T> löst einen Fehler aus, der besagt, dass er nicht mit Typparametern verwendet werden kann

75

Gestern habe ich den Code implementiert:

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

Es war kompilierbar und funktionierte.

Heute (wahrscheinlich habe ich etwas geändert) erhalte ich ständig den Fehler:

Die nicht generische Methode 'Microsoft.Practices.Unity.IUnityContainer.Resolve (System.Type, Zeichenfolge, Parameter Microsoft.Practices.Unity.ResolverOverride [])' kann nicht mit Typargumenten verwendet werden

Mein Kollege hat den gleichen Quellcode und nicht den gleichen Fehler. Warum? Wie kann das Problem behoben werden?

PS

Zeile "using Microsoft.Practices.Unity;" ist im Usings-Bereich vorhanden.

Ich habe versucht, die generische Version durch eine nicht generische zu ersetzen:

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

Und habe noch einen Fehler:

Keine Überladung für die Methode 'Auflösen' erfordert '1'-Argumente

Es scheint, als würde auf eine der Baugruppen nicht verwiesen. Aber auf welche? Ich habe 2 von ihnen referenziert: 1. Microsoft.Practices.Unity.dll 2. Microsoft.Practices.ServiceLocation.dll

PPS Ich habe ein ähnliches Problem gesehen: http://unity.codeplex.com/WorkItem/View.aspx?WorkItemId=8205, aber es wurde als "kein Fehler" behoben.

Jeder Gedanke wird hilfreich sein

Budda
quelle
Verwenden Sie Unity 2.0?
Vadim
3
Sie werden wahrscheinlich feststellen, dass es das Power Commands-Add-On ist, das nicht verwendete Namespace mithilfe von Klauseln entfernt. Der Namespace wird "nicht verwendet", wenn sich Ihr Code in einem nicht kompilierbaren Zustand befindet und Sie wahrscheinlich die Gewohnheit haben, die Datei während der Bearbeitung zu speichern - und das Add-On entfernt die zusätzlichen Verwendungen beim Speichern.
Curt Nichols

Antworten:

174

Ich hatte das gleiche Problem und fand das "Update" beim Betrachten von Prism-Beispielcodedateien. Selbst wenn es sich in Unity V2 nicht um eine DLL handelt, müssen Sie Ihrer Klasse einen Verweis hinzufügen auf: Microsoft.Practices.Unity

Mein vollständiger Abschnitt "Verwenden" lautet wie folgt

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

Ich bin nicht sicher, ob Sie Silverlight verwenden, aber die generische Version für Container.Resolve IS in Microsoft.Practices.Unity.

Rodrigo
quelle
9
Genau. Vor einiger Zeit habe ich festgestellt, dass das Hinzufügen von "using Microsoft.Practices.Unity;" behebt ein Problem.
Budda
1
Das hat mir auch geholfen, aber verdammter Resharper stöhnt jetzt über unbenutzte "Direktiven".
IbrarMumtaz
6
Der Grund dafür ist, dass das Auflösen mit einem Typparameter eine Erweiterungsmethode in Microsoft.Practices.Unity ist, während Resolve () ohne Typparameter nur eine Methode auf der Schnittstelle (oder Klasse) ist.
Geoff
1
Danke! All diese Jahre später geschah dies nur mit brandneuem Code. HttpClient ist mit diesen 'versteckten' Erweiterungsgeheimnissen genauso. Kein Fan. Ich mag Simple Injector.
TheDev6
12
Und FWIW, in der neuen und angeblich hochkompatiblen Unity 5, ist der Namespace jetzt Unityund nicht Microsoft.Practices.Unity.
Ken Smith
43

Microsoft besitzt Unity nicht mehr und es ist in Version 5, der Namespace ist jetzt:

using Unity;

Stellen Sie sicher, dass sich dies in Ihrem Verwendungsabschnitt befindet, wenn Sie Folgendes verwenden:

container.Resolve<T>();
RandomUs1r
quelle
1
Beachten Sie, dass für den Fall, dass Sie Prism verwenden, die aktuelle stabile Version (6.3.0) von Prism weiterhin Unity 4.0.1 verwendet, wo Sie noch müssenusing Microsoft.Practices.Unity;
Ray
Im Ernst, dieser hat mich verrückt gemacht. Vielen Dank!
str8ball
1

Ich war mit diesem Problem konfrontiert und keine dieser Antworten hat mir nicht geholfen. Ich habe den Fehler bei der Kompilierung erhalten

Unbekannte Methode RegisterType () von Microsoft.Practices.Unity.IUnityContainer

für meinen unten stehenden Code.

Container.RegisterType<IMyInterface, MyClass>();

Ich habe festgestellt, dass dieses Problem auftritt, wenn Sie es nicht IMyInterfacein die Klasse implementiert haben MyClass. Hoffe, es löst sich auch für Sie auf ...

Ranjith
quelle
0

In meiner Situation hat die Klasse, die ich mit Unity umbrochen habe, von einer abstrakten Basisklasse geerbt, und diese Basisklasse hatte KEINEN parameterlosen Konstruktor. Nachdem ich meinen Code geändert hatte, um einen parameterlosen Konstruktor für die Basisklasse zu verwenden, verschwand das Problem.

Peter Howe
quelle
0

In meiner Situation ließ Bootstrapper sein eigenes Resolve ohne die generische Version implementieren, sodass das Unity Resolve von Microsoft nicht gefunden werden konnte. Das Hinzufügen der richtigen Verwendungen hat den Trick getan.

PmanAce
quelle