2016-09-02 1 views
4

I Unity bin mit meiner DI zu tun und ich habe folgende Fehler aufgetreten: -.Api Controller verfügt über einen parameter öffentlichen Konstruktor Fehler

„Ein Fehler ist aufgetreten, wenn eine Steuerung des Typs‚UploadController‘erstellen versuchen, Stellen Sie sicher, dass der Controller einen parameterlosen öffentlichen Konstruktor hat. "

Ich habe folgendes UnityResolver: -

public class UnityResolver : IDependencyResolver, IDependencyScope, System.Web.Http.Dependencies.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 habe eine UnityConfig wie folgt erstellt: -

public static class UnityConfig 
{ 
    public static void RegisterComponents() 
    { 
     var container = new UnityContainer(); 

     // register all your components with the container here 
     // it is NOT necessary to register your controllers 

     // e.g. container.RegisterType<ITestService, TestService>(); 

     BuildUnityContainer(); 
     GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container); 
    } 

    private static IUnityContainer BuildUnityContainer() 
    { 
     var container = new UnityContainer(); 

     // register all your components with the container here 
     // you don't need to register controllers 
     container.RegisterType<IFileHelpers, FileHelpers>(); 
     container.RegisterType<IDatabaseHelper, DatabaseHelper>(); 
     container.RegisterType<IPlayersHelpers, PlayersHelpers>(); 
     container.RegisterType<IBaseRepository, BaseRepository>(); 
     container.RegisterType<IAttribsRepository, AttribsRepository>(); 
     container.RegisterType<IPlayerRepository, PlayerRepository>(); 
     container.RegisterType<IFileRepository, FileRepository>(); 
     container.RegisterType<IPlayerAttribsRepository, PlayerAttribsRepository>(); 

     container.RegisterType<FMContext>(); 
     container.RegisterType<UserManager<ApplicationUser>>(new HierarchicalLifetimeManager()); 
     container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(new HierarchicalLifetimeManager()); 

     return container; 
    } 
} 

}

Im Initialisierung every im WebApiConfig .cs

public static void Register(HttpConfiguration config) 
    { 
     // Web API configuration and services 
     // Configure Web API to use only bearer token authentication. 
     config.SuppressDefaultHostAuthentication(); 
     config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType)); 

     // Web API configuration and services 
     var container = new UnityContainer(); 
     UnityConfig.RegisterComponents(); 
     config.DependencyResolver = new UnityResolver(container); 

     config.EnableCors(); 

     // Web API routes 
     config.MapHttpAttributeRoutes(); 

     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
    } 
} 

Und das ist meine UploadController Klasse: -

public class UploadController : ApiController 
{ 
    private readonly IFileHelpers _fileHelpers; 
    private readonly IDatabaseHelper _databaseHelper; 
    private readonly IPlayersHelpers _playersHelpers; 

    public UploadController(IFileHelpers fileHelpers, IDatabaseHelper databaseHelper, IPlayersHelpers playersHelpers) 
    { 
     _fileHelpers = fileHelpers; 
     _databaseHelper = databaseHelper; 
     _playersHelpers = playersHelpers; 
    } 

    public async Task<HttpResponseMessage> Post() 
    {........................} 

Können Sie mir bitte helfen bei der Bestimmung, was mache ich falsch. Muss ich etwas anderes erklären, damit dies funktioniert?

Vielen Dank für Ihre Hilfe und Zeit

+0

Haben Sie versucht, einen öffentlichen Konstruktor ohne Parameter in der UploadController-Klasse zu definieren? – Paul

+0

Dieser Fehler tritt normalerweise auf, wenn das DI-Framework die konkrete Implementierung einer Schnittstelle nicht auflösen kann. Stellen Sie sicher, dass Sie das Mapping (Schnittstelle zur konkreten Implementierung) fehlerfrei definiert haben. – Shyju

+0

@Paul Ich möchte keinen parameterlosen Konstruktor definieren. Ich dachte, das war der Punkt von DI in erster Linie – Johann

Antwort

4

In Ihrer Register-Methode haben Sie den folgenden Code:

// ... 
// Web API configuration and services 
var container = new UnityContainer(); 
UnityConfig.RegisterComponents(); 
config.DependencyResolver = new UnityResolver(container); 

Allerdings gibt nichts zu diesem Container registriert ist. In Ihrer statischen UnityConfig-Klasse wird ein separater Container (mit Registrierungen) erstellt. Dieser Container wird jedoch nicht an das UnityResolver-Objekt übergeben.

+0

Sie haben Recht Rob! Habe meinen Code geändert und es hat funktioniert! Vielen Dank – Johann

+0

Gut zu @Johann zu hören! –

+0

Meine Lösung sieht ungefähr so ​​aus ... config.DependencyResolver = new UnityDependencyResolver (UnityBootstrapper.GetConfiguredContainer()); Aber ja, der Container war für den Controller nicht verfügbar, bis ich das getan habe. – RandomUs1r

Verwandte Themen