没有匹配的绑定可用,并且该类型在Ninject中不可自绑定

时间:2013-02-12 19:46:33

标签: ninject ninject.web.mvc

我正在使用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; }
    }

2 个答案:

答案 0 :(得分:11)

Ninjects寻找构造函数in the following order

  1. 标有[Inject]
  2. 的构造函数
  3. 参数最多的建设者
  4. 默认构造函数
  5. 在您的情况下,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来解决它。