2016-06-03 22 views
0

Seit der Migration meines WebApi-Projekts von VS2013 auf VS2015 kann meine Abhängigkeitsinjektion nicht mehr funktionieren. Ich benutze StructureMap. Ich erhalte einen Fehler, der diese Ausnahmemeldung enthält: "Beim Versuch, einen Controller vom Typ 'SearchListController' zu erstellen, ist ein Fehler aufgetreten. Stellen Sie sicher, dass der Controller über einen parameterlosen öffentlichen Konstruktor verfügt." Das hat früher funktioniert. Kann mir jemand sagen, was ich falsch mache? Bitte vergib mir, wenn ich diese Frage nicht richtig geschrieben habe. Ich denke, das ist die erste Frage, die ich hier gepostet habe.Strukturkarte - Stellen Sie sicher, dass der Controller über einen parameterlosen öffentlichen Konstruktor verfügt.

namespace SearchWebAPI.DependencyResolution 
    { 
     using StructureMap; 

     public static class IoC 
     { 
      public static IContainer Initialize() 
      { 
       return new Container(c => 
       { 
        c.AddRegistry<DefaultRegistry>(); 
       }); 
      } 
     } 
    } 

namespace SearchWebAPI.DependencyResolution { 
    using StructureMap.Configuration.DSL; 
    using StructureMap.Graph; 
    using SearchWebAPI.Models; 

    public class DefaultRegistry : Registry { 
     #region Constructors and Destructors 

     public DefaultRegistry() { 
      Scan(
       scan => { 
        scan.TheCallingAssembly(); 
        scan.WithDefaultConventions(); 
        scan.With(new ControllerConvention()); 
       }); 
      For<ISearchListRepository>().Use<SearchListRepository>(); 
     } 

     #endregion 
    } 
} 
+2

Haben Sie entweder ersetzen MVC 'DependencyResolver' oder' IControllerFactory'? Sie benötigen eine dieser Komponenten, um MVC an StructureMap weiterzuleiten. – Steven

Antwort

2

Der Fehler Sie sehen (ein Fehler aufgetreten ist, wenn eine Steuerung des Typs ‚SearchListController‘ zu schaffen versucht) ist das Ergebnis der StructureMap nicht in der Lage zu sein, die Abhängigkeiten in Ihrem Controller zu lösen und ist in der Regel gekoppelt.

Nachdem Sie sich Ihren Code angesehen haben, ist es schwer zu erkennen, wo das Problem liegt. Wie haben Sie StructureMap mit Ihrer ASP.NET-Anwendung konfiguriert? (über Ihre eigene Controller-Fabrik oder über MVCs DependencyResolver?), und können Sie mehr von Ihrem Code zur Verfügung stellen?

Auch die Verwendung von StructureMaps AssertConfigurationIsValid(); ist eine gute Möglichkeit, Probleme zu debuggen. Sie können es so nennen:

var container = new Container(); 
container.AssertConfigurationIsValid(); 
1

Ich habe das jetzt funktioniert. Hier ist mein Code:

namespace SearchWebAPI.DependencyResolution { 
    using StructureMap; 

    public static class IoC { 
     public static IContainer Initialize() { 
      return new Container(c => c.AddRegistry<DefaultRegistry>()); 
     } 
    } 
} 

namespace SearchWebAPI.DependencyResolution 
{ 
    using StructureMap.Configuration.DSL; 
    using StructureMap.Graph; 
    using SearchWebAPI.Models; 

    public class DefaultRegistry : Registry 
    { 
     #region Constructors and Destructors 

     public DefaultRegistry() 
     { 
      Scan(
       scan => 
       { 
        scan.TheCallingAssembly(); 
        scan.WithDefaultConventions(); 
        scan.With(new ControllerConvention()); 
       }); 
     } 

     #endregion 
    } 
} 

namespace SearchWebAPI 
{ 
    using SearchWebAPI.DependencyResolution; 
    using StructureMap; 
    using System.Web.Http; 
    using System.Web.Mvc; 

    public class WebApiApplication : System.Web.HttpApplication 
    { 
     protected void Application_Start() 
     { 
      AreaRegistration.RegisterAllAreas(); 
      GlobalConfiguration.Configure(WebApiConfig.Register); 
      App_Start.StructuremapMvc.Start(); 

      //StructureMap Container 
      IContainer container = IoC.Initialize(); 

      //Register for MVC 
      DependencyResolver.SetResolver(new StructureMapDependencyResolver(container)); 

      //Register for Web API 
      GlobalConfiguration.Configuration.DependencyResolver = new StructureMapDependencyResolver(container); 
     } 
    } 
} 

Zwei Zeilen Code fixiert mein Problem:

//Register for MVC 
DependencyResolver.SetResolver(new StructureMapDependencyResolve(container)); 

//Register for Web API 
GlobalConfiguration.Configuration.DependencyResolver = new StructureMapDependencyResolver(container);