我正在使用Ninjec,Ninject.Web.MVC和Ninject.Web.Common
当我启动我的mvc应用程序时,我收到此绑定错误:
我的绑定有什么问题?
激活DbConnection时出错
没有匹配的绑定可用,并且该类型不可自我绑定。
激活路径:
4)将依赖关系DbConnection注入参数 DbContext类型的构造函数的existingConnection
3)将依赖关系DbContext注入到参数dbContext中 GenericRepository {User}
类型的构造函数2)将依赖关系IGenericRepository {User}注入参数 HomeController类型的构造函数的repo
1)请求HomeController
建议:
1)确保您已为DbConnection定义了绑定。
2)如果在模块中定义了绑定,请确保该模块 已被加载到内核中。
3)确保您没有意外创建多个内核。
4)如果使用构造函数参数,请确保参数 name与构造函数参数名称匹配。
5)如果使用自动模块加载,请确保搜索路径 和过滤器是正确的。
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; }
}
答案 0 :(得分:11)
Ninjects寻找构造函数in the following order:
[Inject]
在您的情况下,TLPContext
构造函数未标记为[Inject]
,因此适用2.规则,Ninject将尝试解析base class contructor,然后抛出异常。
因此,您可以通过使用InjectAttribute
[Inject]
public TLPContext()
: base("DefaultConnection")
{
this.Configuration.LazyLoadingEnabled = false;
}
或者,在注册ToConstructor
时,您可specify the constructor使用TLPContext
方法:
kernel.Bind<TLPContext>().ToConstructor(_ => new TLPContext());
答案 1 :(得分:4)
我曾经遇到过类似的问题。我使用的是Ninject MVC
,我尝试使用新的kernel
ctor来实例化StandardKernel
,但它没有用。
我的问题是@Elisa前面提到的第3点:Ensure you have not accidentally created more than one kernel.
我改为使用bootstrapper.Kernel
来解决它。