2014-02-09 3 views
1

У меня есть эта ошибка при нажатии на ссылку на сайт я создаюNinject - Инъекция одноточечно

Error activating IEntityCache using binding from IEntityCache to EntityCache 
No constructor was available to create an instance of the implementation type. 

Activation path: 
4) Injection of dependency IEntityCache into parameter entityCache of constructor of type AlbumRepository 
3) Injection of dependency IAlbumRepository into parameter albumRepository of constructor of type AlbumService 
2) Injection of dependency IAlbumService into parameter albumService of constructor of type AlbumController 
1) Request for AlbumController 

Suggestions: 
1) Ensure that the implementation type has a public constructor. 
2) If you have implemented the Singleton pattern, use a binding with InSingletonScope() instead. 

EntityCache одноэлементно, без общественного строительства. Так вот как я сделал свои привязки Ninject

kernel.Bind<IAlbumService>().To<AlbumService>(); 
      kernel.Bind<IAlbumRepository>().To<AlbumRepository>(); 
      kernel.Bind<IDbSetWrapper<Album>>().To<DbSetWrapper<Album>>(); 
      kernel.Bind<IEntityCache>().To<EntityCache>().InSingletonScope(); 

Что я делаю неправильно?

EDIT

Вот мой репозиторий:

public AlbumRepository(DatabaseContext context, IDbSetWrapper<Album> dbSetWrapper, IEntityCache entityCache) 
      : base(context, dbSetWrapper, entityCache) 

Как передать в IEntityCache?

ответ

3

EntityCache - одноэлементный, без общественного строительства.

И как вы ожидаете, что ваша инфраструктура DI сможет создавать экземпляр этого класса? Это не может работать, если ваш класс не имеет общедоступного конструктора по умолчанию или конструктора, который принимает аргументы, которые уже зарегистрированы в вашем DI.

Вы, возможно, потребуется предоставить конкретного экземпляра себя, если класс не имеет открытый конструктор:

kernel 
    .Bind<IEntityCache>() 
    .ToMethod(context => ...return your specific instance here...) 
    .InSingletonScope(); 

, например:

kernel 
    .Bind<IEntityCache>() 
    .ToMethod(context => EntityCache.Instance) 
    .InSingletonScope(); 
+0

Обновленный мой вопрос немного. –

+0

Ваше обновление не устраняет проблему, с которой вы сталкиваетесь. Ваша проблема связана с тем, что вы пытаетесь зарегистрировать класс, который не может быть явно сконструирован Ninject: 'kernel.Bind (). К () .InSingletonScope();'. Простая причина этого заключается в том, что реализация 'EntityCache', как вы уже сказали, не имеет открытого конструктора, а Ninject не знает, как ее создать. В своем ответе я проиллюстрировал, как вы могли бы помочь, предоставив конкретный экземпляр, который вы создали сами. –

+0

Я пробую это, когда мы говорим - спасибо. –

Смежные вопросы