2017-01-26 31 views
1

Когда я пытаюсь создать новый IRepository<Tag> с использованием kernel.Get, Ninject генерирует исключение. Я правильно использую Ninject и правильно ли настроены привязки?Ninject не может создать объект. Исключение, возникающее при получении из ядра

Метод класса NinjectDependencyResolver:

private void AddBindings() 
     { 
      var mapperConfiguration = new MapperConfiguration(cfg => 
      { 
       cfg.AddProfile(new TagProfile()); 
      }); 
      var mapper = mapperConfiguration.CreateMapper(); 
      _kernel.Bind<BlogDbContext>().ToSelf().InRequestScope(); 
      _kernel.Bind<IRepository<Tag>, Repository<Tag>>(); 
      _kernel.Bind<IMapper>().ToConstant(mapper); 

      var repository = _kernel.Get<IRepository<Tag>>(); // exception thrown here 
      _kernel.Bind<ITagService, TagService>(); 
     } 

Класс Repository:

`public class Repository<T> : IRepository<T> where T : class 
{ 
    private readonly BlogDbContext _db; 

    public Repository(BlogDbContext db) 
    { 
     _db = db; 
    } 
}` 

P.S.. Я не знаю, важно ли это, но его репозиторий интерфейса находится в той же сборке, а регистрация Ninject в другом.

+0

Вы связывание 'BlogDbContext' в области действия запроса, но при вызове' AddBindings', вы в контексте запроса? – mason

+0

@mason, Извините, я не понимаю, что вы имеете в виду. Но когда я пытаюсь 'InSingletonScope() \t' все работает хорошо. Но Синглтон не хотел бы использовать. – Lightness

+0

Запрос - это HTTP-запрос, как клиент, обращающийся к странице. Когда вы определяете срок жизни ваших зависимостей, вы можете оживить объект только для этого конкретного запроса, который у вас есть сейчас. Но это означает, что зависимость не сможет быть разрешена за пределами запроса, поэтому позже, когда он попытался получить «IRepository », он не может удовлетворить конструктору для «Репозитория ». Или, по крайней мере, это мое предположение о том, что происходит. – mason

ответ

2

Ваш синтаксис связи неверен. Изменение:

_kernel.Bind<IRepository<Tag>, Repository<Tag>>(); 

To:

_kernel.Bind<IRepository<Tag>>.To<Repository<Tag>>();