Unity IoC fügt keine Abhängigkeit in den Web-API-Controller ein
Ich bin sehr neu mit Unity, aber mein problem ist, dass, Wann immer ich rufe meine web-service, bekomme ich eine exception, die besagt, dass
"Stellen Sie sicher, dass der controller hat einen parameterlosen public-Konstruktor"
Ich verfolgt habe mehrere tutorials und ich bekomme immer noch das gleiche Problem.
In der Register-Funktion meines WebApiConfig Klasse, ich habe
var container = new UnityContainer();
container.RegisterType<IValidator, Validator>(new HierarchicalLifetimeManager());
config.DependencyResolver = new UnityResolver(container);
Hier ist mein UnityResolver Klasse
using Microsoft.Practices.Unity;
using System;
using System.Collections.Generic;
using System.Web.Http.Dependencies;
public class UnityResolver : IDependencyResolver
{
protected IUnityContainer container;
public UnityResolver(IUnityContainer container)
{
if (container == null)
{
throw new ArgumentNullException("container");
}
this.container = container;
}
public object GetService(Type serviceType)
{
try
{
return container.Resolve(serviceType);
}
catch (ResolutionFailedException)
{
return null;
}
}
public IEnumerable<object> GetServices(Type serviceType)
{
try
{
return container.ResolveAll(serviceType);
}
catch (ResolutionFailedException)
{
return new List<object>();
}
}
public IDependencyScope BeginScope()
{
var child = container.CreateChildContainer();
return new UnityResolver(child);
}
public void Dispose()
{
container.Dispose();
}
}
Ich noch nicht registriert haben, jeden Controller, wie in jedem tutorial Forderungen, die ich nicht brauchen, dies zu tun. Hier ist meine eigentliche controller
public class Controller: ApiController
{
private IValidator _validator;
public Controller(IValidator validator)
{
this._validator = validator;
}
[HttpPost]
public void ReceiveIPN()
{
}
}
Hat jemand irgendwelche Ideen, was kann ich falsch gemacht? Danke!
EDIT 1: Hier ist die "Implementierung" von der Validator-Klasse. Es ist ziemlich leer, weil ich nicht einführen wollen, ein Fehler hier, bis ich beschloss die Einheit Ausgabe.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
public class Validator: IValidator
{
public bool ValidateIPN(string body)
{
throw new NotImplementedException();
}
}
EDIT 2: Hier ist der gesamte Fehler Antwort, die ich bekomme, wenn ich versuche zu rufen, die web-api-route mit Fiddler
{"message":"Ein Fehler ist aufgetreten.","exceptionMessage":"Ein Fehler
aufgetreten beim Versuch, einen Domänencontroller zu erstellen des Typs 'Controller'. Machen
sicher, dass der controller hat einen parameterlosen public
Konstruktor.","exceptionType":" - System.InvalidOperationException","stackTrace":"
bei
System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Erstellen(HttpRequestMessage
Anfrage, HttpControllerDescriptor controllerDescriptor Geben
controllerType)
System.Web.Http.Controller.HttpControllerDescriptor.CreateController(HttpRequestMessage
request) an
System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()","innerException":{"message":"Ein
Fehler ist aufgetreten.","exceptionMessage":"Art" - Projekt.Controller'
keinen Standardwert
constructor","exceptionType":" - System.ArgumentException","stackTrace":"
System.Linq -.Ausdrücke.Ausdruck.Neue(Type Type) bei
System.Web.Http.Intern.TypeActivator.Erstellen[TBase](Typ
instanceType) bei
System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage
Anfrage, Type controllerType, Func`1& activator) an
System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Erstellen(HttpRequestMessage
Anfrage, HttpControllerDescriptor controllerDescriptor Geben
controllerType)"}}
InformationsquelleAutor der Frage Carlos Rodriguez | 2015-04-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
So, nach Stunden schlug mit meinem Kopf gegen eine Wand, ich habe festgestellt, dass dies nicht funktionierte, da hatte ich bei einer OWIN/Katana-Start.cs Klasse in meinem Projekt. Jetzt weiß ich nicht genau, was hier Los ist, also mehr Informationen wären toll.
Im Grunde, seit ich mit OWIN/Katana, ich hatte ein Startup.cs-Datei, erstellt eine neue HttpConfiguration Objekt und konfiguriert es, ähnlich wie es gemacht wird, in der WebApiConfig.cs-Klasse.
Sieht es aus wie der erste code läuft durch den WebApiConfig die Funktion Register und setzt DANN, dass HttpConfiguration Objekt mit dem man generiert im Autostart.cs-Datei. Ich hatte, um meine container-setup-Zeug hier ein, um für Sie zu arbeiten.
Sorry, dass ich nicht bringen OWIN Sachen vor. Dies ist ziemlich neu für mich und ich wusste nicht, dass es relevant war. Hoffentlich spart jemand anderes die Schmerzen, die ich gerade durchgemacht.
InformationsquelleAutor der Antwort Carlos Rodriguez
Ihre Unity-container ist wahrscheinlich immer entsorgt, weil es nur in dem definierten Umfang Ihrer
WebApiConfig.Register()
Methode. Wenn Sie definieren Ihre container, der als Mitglied des Globalen, die Ihre container, um für die Lebenszeit der app, sollte es funktionieren.Edit: auch vergessen Sie nicht, entsorgen Sie den Behälter auf Application_End.
InformationsquelleAutor der Antwort moarboilerplate
Ich weiß, dies ist eine alte post, aber da ich gerade lief in das gleiche problem, die Lösung war, pass einfach auf das config-Objekt, die Einheit der Anmeldung Funktion und verwenden Sie die DependencyResolver aus, Beispiel:
EDIT: Nur darauf hingewiesen, dass die akzeptierte Antwort ist genau das... Sorry für den spam 😉
InformationsquelleAutor der Antwort spilote