Keine passenden Bindungen vorhanden sind, und der Typ ist nicht selbst gebunden in Ninject
Ich bin mit Ninjec, Ninject.Web.MVC und Ninject.Web.Gemeinsame
Wenn ich mein mvc-Anwendung bekomme ich diese verbindliche Fehler:
Was mache ich falsch in meiner Bindung?
Fehler aktivieren DbConnection
Keine passenden Bindungen vorhanden sind, und der Typ ist nicht selbst gebunden werden.
Aktivierungs-Pfad:
4) Injektion der Abhängigkeit DbConnection in parameter
existingConnection-Konstruktor des Typs DbContext3) Injektion der Abhängigkeit DbContext in parameter dbContext von
Konstruktor des Typs GenericRepository{User}2) Injektion der Abhängigkeit IGenericRepository{User} in parameter
repo-Konstruktor des Typs HomeController1) Anfrage für HomeController
Vorschläge:
1) stellen Sie Sicher, dass Sie definiert haben, eine Bindung für DbConnection.
2) Wenn die Bindung wurde in einem Modul definiert, sicherstellen, dass das Modul
wurde in den kernel geladen.3) Sicherzustellen, dass Sie haben nicht zufällig entstanden mehr als ein kernel.
4) Wenn Sie mit Konstruktor Argumenten, sicherzustellen, dass die parameter
name entspricht der Konstruktoren parameter name.5) Wenn Sie die automatische laden der module, gewährleisten den Pfad suchen
und Filter korrekt ist.
public interface IGenericRepository<T> where T : class
{
}
public class GenericRepository<T> : IGenericRepository<T> where T : class
{
public GenericRepository(TLPContext dbContext)
{
DbContext = dbContext;
}
protected TLPContext DbContext { get; private set; }
}
[assembly: WebActivator.PreApplicationStartMethod(typeof(TLP.App_Start.NinjectWebCommon), "Start")]
[assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(TLP.App_Start.NinjectWebCommon), "Stop")]
namespace TLP.App_Start
{
using Microsoft.Web.Infrastructure.DynamicModuleHelper;
using Ninject;
using Ninject.Web.Common;
using System;
using System.Web;
using TLP.DataAccess;
using TLP.DataAccess.Contract;
using TLP.DataAccess.Implementation;
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();
kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();
kernel.Bind<TLPContext>();
kernel.Bind(typeof(IGenericRepository<>)).To(typeof(GenericRepository<>));
return kernel;
}
}
}
[DbModelBuilderVersion(DbModelBuilderVersion.V5_0)]
public class TLPContext : DbContext
{
public TLPContext()
: base("DefaultConnection")
{
//We do not want implicit uncontrollable lazy loading, instead we use the explicit Load method
this.Configuration.LazyLoadingEnabled = false;
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
//Primary key
modelBuilder.Entity<User>().HasKey(p => p.UserId);
modelBuilder.Entity<User>().Property(p => p.FirstName).HasMaxLength(30).IsRequired();
modelBuilder.Entity<User>().Property(p => p.RegisteredAt).IsRequired();
}
public DbSet<User> Users { get; set; }
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ninjects sieht für Konstruktoren in der folgenden Reihenfolge:
[Inject]
In Ihrem Fall Ihre
TLPContext
Konstruktor ist nicht markiert, mit[Inject]
also die 2. Regeln gilt und Ninject werden versuchen, Sie zu beheben, die base class contructor, und wirft dann die exception.So können Sie dies lösen, indem Sie die Kennzeichnung der Konstruktor mit der
InjectAttribute
Oder Sie können geben Sie den Konstruktor mit der
ToConstructor
Methode, bei der Registrierung IhreTLPContext
:ToConstructor()
tun Sie immer noch genau die gleiche Fehlermeldung: "4) Injektion der Abhängigkeit DbConnection in parameter existingConnection-Konstruktor des Typs DbContext"? Sind Sie sicher, dass Ihre app richtig neu kompiliert. Können Sie versuchen zu reinigen und neu erstellen Ihre Lösung?ToConstructor
sonst, weil IhrTLPContext
hat mehrere contructors, weil seine Basis-KlasseDbContext
Ninject kann nicht wählen Sie die richtigen Konstruktor so hast du die Ausnahme.Früher habe ich ähnliches problem. Ich war mit
Ninject MVC
und ich habe versucht zu instanziierenkernel
mit dem neuenStandardKernel
ctor, und es hat nicht funktioniert.Mein problem war, dass der Punkt 3, die @Elisa bereits erwähnt:
Ensure you have not accidentally created more than one kernel.
Ich löste es, indem
bootstrapper.Kernel
statt.