2017-11-21 4 views
1

Ich habe viel gesucht, sowohl online, als auch das Debugging, lese Dokumente für dryioc erneut und habe mir die Beispiele angeschaut. Ich glaube nicht, dass meine Probleme bei Dryioc liegen, oder vielleicht übersehe ich einen dummen Fehler.dryioc controller.service wird während der Einrichtung aufgelöst, nicht während eines API-Aufrufs

Projekt-Setup => Service => owin + webapi2 Mit attributerouting, Prahlerei und apiversioning

Dies ist, wie ich mein Setup Container

private IContainer SetupDependencyInjection(HttpConfiguration config) 
{ 
     var container = new Container(); 
     container.WithWebApi(config, throwIfUnresolved: type => typeIsController()); 
     container.RegisterWebApiControllers(config); 
     container.Register<IObjectFactory, ObjectFactory>(Reuse.Singleton); 

     RegisterStoreServices(container); 
     RegisterMetadata(container); 

     var validate = container.Validate(); 
     var verify = container.VerifyResolutions(); 
     if (validate.Any() || verify.Any()) 
     { 
      throw new Exception("Error occured while setting up service dependencies."); 
     } 

     using (var c = container.OpenScope(Reuse.WebRequestScopeName)) 
     { 
      var songController = c.Resolve<Musify.WebApi.Controllers.v1._0.SongsController>(); 
      var GenresController = c.Resolve<Musify.WebApi.Controllers.v1._0.GenresController>(); 
     } 
     return container; 
} 

Beide RegisterStoreServices und RegisterMetadata nur Singleton oder vorübergehende Anmeldungen enthalten.

Wenn ich versuche, eine Controller-Methode auf meinen API-Controller zu nennen, erhalte ich die folgenden Fehler

{ 
    "message": "An error has occurred.", 
    "exceptionMessage": "An error occurred when trying to create a controller of type 'SongsController'. Make sure that the controller has a parameterless public constructor.", 
    "exceptionType": "System.InvalidOperationException", 
    "stackTrace": " at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)\r\n at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request)\r\n at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()", 
    "innerException": { 
    "message": "An error has occurred.", 
    "exceptionMessage": "Unable to resolve Musify.Api.Service.Data.ISongRepository as parameter \"songRepository\"\r\n in scoped Musify.WebApi.Controllers.v1._0.SongsController.\r\nWhere no service registrations found\r\n and number of Rules.FallbackContainers: 0\r\n and number of Rules.UnknownServiceResolvers: 0", 
    "exceptionType": "DryIoc.ContainerException", 
    "stackTrace": " at DryIoc.Throw.It(Int32 error, Object arg0, Object arg1, Object arg2, Object arg3)\r\n at DryIoc.Container.ThrowUnableToResolve(Request request)\r\n at DryIoc.Container.DryIoc.IContainer.ResolveFactory(Request request)\r\n at DryIoc.ReflectionFactory.CreateExpressionOrDefault(Request request)\r\n at DryIoc.Factory.GetExpressionOrDefault(Request request)\r\n at DryIoc.Factory.GetDelegateOrDefault(Request request)\r\n at DryIoc.Container.ResolveAndCacheDefaultDelegate(Type serviceType, Boolean ifUnresolvedReturnDefault, IScope scope)\r\n at DryIoc.Container.DryIoc.IResolver.Resolve(Type serviceType, Boolean ifUnresolvedReturnDefault)\r\n at DryIoc.WebApi.DryIocDependencyScope.GetService(Type serviceType)\r\n at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator)\r\n at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)" 
    } 
    } 

Ich weiß, dass in vielen Fällen sind dies, weil der Dienst nicht registriert ist, aber ich habe .

container.Register<ISongRepository, SongRepository>(Reuse.Singleton); 

Wie Sie in der Faust Code-Schnipsel sehen können, ich valide, überprüfen, und ich container.openscope sogar versucht, wenn der Container registriert wurde, zu sehen. Und auf dem Container kann ich sehen, dass das Songrepository ebenfalls ausgefüllt ist.

Also ich vermute, irgendwie verwendet das Webapi die Controller nicht in den Container injiziert.

Mache ich in meiner Abhängigkeitseinstellung etwas falsch?

public void Configuration(IAppBuilder appBuilder) 
    { 
     SetupLogging(); 

     var config = new HttpConfiguration(); 
     SetupRouting(config); 
     SetupVersioning(config); 
     SetupJson(config); 
     SetupDocumentation(config); 
     SetupDependencyInjection(config); 
     appBuilder.UseWebApi(config); 
     appBuilder.UseErrorPage(ErrorPageOptions.ShowAll); 
    } 

Ich bin mir nicht sicher, ob es wichtig ist, aber ich bin der Behälter nach oben einstellen, nachdem alles andere konfiguriert wurde.

+0

Ich werde meine eigene Antwort als eine Antwort für jetzt akzeptieren, da es funktioniert hat, aber ich möchte trotzdem noch eine weitere Erklärung – Hairydruidy

Antwort

1

Nach einigem Herumspielen, habe ich es nach der Arbeit die Zeilen hinzufügen markiert mit diesem //

var container = SetupDependencyInjection(config); 
     appBuilder.UseDryIocOwinMiddleware(container); //this 
     appBuilder.UseWebApi(config); 
     appBuilder.UseDryIocWebApi(config); //this 

Ich würde allerdings eine explenation mögen, wenn jemand mir eine geben könnte. Weil ich in einem anderen Beitrag gelesen habe, dass ein Typ Probleme hatte, weil er sowohl UseWebApi als auch UseDryIocWebApi verwendet.

Aber ohne die OwinMiddleware, würde es immer noch nicht funktionieren. Was bewirken beide Funktionen?

Oder habe ich einen "falschen Fix" verwendet?

Verwandte Themen