Соответствующие привязки недоступны, и тип не является самосвязываемым в Ninject
Я использую Ninjec, Ninject.Web.MVC и Ninject.Web.Common
Когда я запускаю свое приложение MVC, я получаю эту ошибку привязки:
Что я не прав в своем переплете?
Ошибка активации DbConnection
Соответствующие привязки недоступны, и тип не является самосвязываемым.
Путь активации:
4) Внедрение зависимости DbConnection в параметр существующие Connection конструктора типа DbContext
3) Внедрение зависимости DbContext в параметр dbContext конструктора типа GenericRepository {User}
2) Внедрение зависимости IGenericRepository{User} в параметр repo конструктора типа HomeController
1) Запрос на HomeController
Предложения:
1) Убедитесь, что вы определили привязку для DbConnection.
2) Если привязка была определена в модуле, убедитесь, что модуль был загружен в ядро.
3) Убедитесь, что вы случайно не создали более одного ядра.
4) Если вы используете аргументы конструктора, убедитесь, что имя параметра соответствует имени параметра конструкторов.
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 ответа
Ninjects ищет конструкторы в следующем порядке:
- Конструкторы отмечены
[Inject]
- Строители с наибольшим параметром
- Стандартный конструктор
В вашем случае ваш TLPContext
конструктор не отмечен [Inject]
поэтому применяются правила 2. Ninject попытается разрешить конструктор базового класса, а затем выдает исключение.
Таким образом, вы можете решить эту проблему, пометив конструктор с помощью InjectAttribute
[Inject]
public TLPContext()
: base("DefaultConnection")
{
this.Configuration.LazyLoadingEnabled = false;
}
Или вы можете указать конструктор с ToConstructor
метод при регистрации вашего TLPContext
:
kernel.Bind<TLPContext>().ToConstructor(_ => new TLPContext());
Раньше у меня была похожая проблема. Я использовал Ninject MVC
и я пытался создать экземпляр kernel
используя новый StandardKernel
ctor, и это не сработало.
Моей проблемой был пункт 3, о котором @Elisa упоминал ранее: Ensure you have not accidentally created more than one kernel.
Я решил это с помощью bootstrapper.Kernel
вместо.