2016-05-11 9 views
0

Ich arbeite an einem ASP.NET WebAPI mit OWIN. Um die Instanzen von DBContext (Entity Framework) zu verwalten, versuche ich Ninject zu verwenden. Allerdings, wenn ich einen Controller aufrufen, gibt das Programm eine Fehlermeldung:Probleme mit Abhängigkeitsinjektion

The controller cannot be created, missing constructor.

Können Sie mir sagen, was falsch ist hier los? Mein Controller-Klasse:

public class Testcontroller 
{ 
    private IApplicationDbContext _context; 

    public Testcontroller(IApplicationDbContext context) 
    { 
     _context = context; 
    } 
} 

Dies ist die Ninject-Datei:

public static class NinjectWebCommon 
{ 
    private static readonly Bootstrapper bootstrapper = new Bootstrapper(); 

    public static void Start() 
    { 
     DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule)); 
     DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule)); 
     bootstrapper.Initialize(CreateKernel); 
    } 

    public static void Stop() 
    { 
     bootstrapper.ShutDown(); 
    } 

    private static IKernel CreateKernel() 
    { 
     var kernel = new StandardKernel(); 
     try 
     { 
      kernel.Bind<Func<IKernel>>().ToMethod(ctx =>() => new Bootstrapper().Kernel); 
      kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>(); 
      kernel.Bind<IApplicationDbContext>().To<ApplicationDbContext>(); 
      GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel); 
      RegisterServices(kernel); 
      return kernel; 
     } 
     catch 
     { 
      kernel.Dispose(); 
      throw; 
     } 
    } 

    private static void RegisterServices(IKernel kernel) 
    { 
    }   
} 

Ninject Abhängigkeit Scope:

public class NinjectDependencyScope : IDependencyScope 
{ 
    IResolutionRoot resolver; 

    public NinjectDependencyScope(IResolutionRoot resolver) 
    { 
     this.resolver = resolver; 
    } 

    public object GetService(Type serviceType) 
    { 
     if (resolver == null) 
      throw new ObjectDisposedException("this", "This scope has been disposed"); 

     return resolver.TryGet(serviceType); 
    } 

    public System.Collections.Generic.IEnumerable<object> GetServices(Type serviceType) 
    { 
     if (resolver == null) 
      throw new ObjectDisposedException("this", "This scope has been disposed"); 

     return resolver.GetAll(serviceType); 
    } 

    public void Dispose() 
    { 
     IDisposable disposable = resolver as IDisposable; 
     if (disposable != null) 
      disposable.Dispose(); 

     resolver = null; 
    } 
} 

// This class is the resolver, but it is also the global scope 
// so we derive from NinjectScope. 
public class NinjectDependencyResolver : NinjectDependencyScope, IDependencyResolver 
{ 
    IKernel kernel; 

    public NinjectDependencyResolver(IKernel kernel) : base(kernel) 
    { 
     this.kernel = kernel; 
    } 

    public IDependencyScope BeginScope() 
    { 
     return new NinjectDependencyScope(kernel.BeginBlock()); 
    } 
} 

Entity Framework DbContext-Klasse:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>, IApplicationDbContext 
{ 
    public ApplicationDbContext() 
     : base("DefaultConnection", throwIfV1Schema: false) 
    { 
     Configuration.ProxyCreationEnabled = false; 
     Configuration.LazyLoadingEnabled = false; 
    } 

    public virtual DbSet<Models.Team> Teams { get; set; } 

    public static ApplicationDbContext Create() 
    { 
     return new ApplicationDbContext(); 
    } 
} 

public interface IApplicationDbContext 
{ 
    DbSet<Models.Team> Teams { get; set; } 

    int SaveChanges(); 
    Task<int> SaveChangesAsync(CancellationToken cancellationToken); 
} 

I versucht, diesem Tutorial zu folgen: http://www.peterprovost.org/blog/2012/06/19/adding-ninject-to-web-api

Was habe ich hier falsch gemacht? Vielen Dank im Voraus!

+1

Abstrakt ApplicationDbContext in eine Schnittstelle und versuchen, diese Schnittstelle zu injizieren. Möglicherweise müssen Sie auch kernel.Bind () ändern. ToSelf(). InRequestScope(); Regester-Schnittstelle von ApplicationDBContext hier. – Venky

+0

Ok, ich habe das versucht, aber das konnte das Problem nicht lösen. Ich habe den obigen Code aktualisiert. Was könnte es sonst sein? –

+0

'öffentliche Klasse Testcontroller { private IApplicationDbContext _context; öffentlicher Testcontroller (IApplicationDbContext-Kontext) { _context = Kontext; } } ' – Venky

Antwort

0

Es sei denn, es war ein schweres Versäumnis in Sie Controller-Code, der Controller erbt nicht von ApiController, wie mit Web-Api

public class TestController : ApiController { 
    private IApplicationDbContext _context; 

    public Testcontroller(IApplicationDbContext context) { 
     _context = context; 
    } 
} 
+0

Danke für Ihre Antwort! Ich habe das hinzugefügt, aber leider bekomme ich immer noch den gleichen Fehler ... –