问题
I am using Ninjec, Ninject.Web.MVC and Ninject.Web.Common
When I start my mvc application I get this binding error:
What do I wrong in my binding?
Error activating DbConnection
No matching bindings are available, and the type is not self-bindable.
Activation path:
4) Injection of dependency DbConnection into parameter existingConnection of constructor of type DbContext
3) Injection of dependency DbContext into parameter dbContext of constructor of type GenericRepository{User}
2) Injection of dependency IGenericRepository{User} into parameter repo of constructor of type HomeController
1) Request for HomeController
Suggestions:
1) Ensure that you have defined a binding for DbConnection.
2) If the binding was defined in a module, ensure that the module has been loaded into the kernel.
3) Ensure you have not accidentally created more than one kernel.
4) If you are using constructor arguments, ensure that the parameter name matches the constructors parameter name.
5) If you are using automatic module loading, ensure the search path and filters are correct.
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; }
}
回答1:
Ninjects looks for constructors in the following order:
- Constructors marked with
[Inject]
- Construtors with the most parameter
- Default contructor
In your case your TLPContext
constructor is not marked with [Inject]
so the 2. rules applies and Ninject will try to resolve the base class contructor and then throws the exception.
So you can solve this by marking your constructor with the InjectAttribute
[Inject]
public TLPContext()
: base("DefaultConnection")
{
this.Configuration.LazyLoadingEnabled = false;
}
Or you can specify the constructor with the ToConstructor
method when registering your TLPContext
:
kernel.Bind<TLPContext>().ToConstructor(_ => new TLPContext());
回答2:
I used to have similar problem. I was using Ninject MVC
and I tried to instantiate the kernel
using the new StandardKernel
ctor, and it did't work.
My problem was the point 3 that @Elisa mentioned earlier: Ensure you have not accidentally created more than one kernel.
I solved it by using bootstrapper.Kernel
instead.
来源:https://stackoverflow.com/questions/14840515/no-matching-bindings-are-available-and-the-type-is-not-self-bindable-in-ninject