Использование универсальных типов при связывании с Ninject - возможно ли это? - PullRequest
3 голосов
/ 26 августа 2011

Используя Ninject, в моей основной программе я вызываю:

var kernel = new StandardKernel(new MyBindings());
var stuff = kernel.Get<MediaPresenter>();

К сожалению, я получаю исключение:

Нет доступных привязок, а тип не самостоятельно Привязываемое.

Я действительно не понимаю, что это значит. Вот мой обязательный класс:

class MyBindings : NinjectModule
{
    public override void Load()
    {
        Bind<MediaPresenter>().ToSelf();
        Bind(typeof (Dao<Book>)).To(typeof (Dao<Book>));
    }
}

Если я уберу строку:

Bind(typeof(Dao<Book>)).To(typeof(Dao<Book>));

Приложение запускается, но тогда я не получаю привязок.

Почему такого рода вещи не работают и как я могу это исправить?

Ответы [ 3 ]

2 голосов
/ 26 августа 2011

Не могу проверить это сейчас, но это должно работать:

Bind(typeof (Dao<>)).To(typeof(Dao<>));

Использование интерфейса, вероятно, лучшая идея в будущем:

Bind(typeof (IDao<>)).To(typeof(Dao<>));
0 голосов
/ 26 августа 2011

Вы должны кодировать интерфейс, поскольку это сделает ваш код более тестируемым.Посмотрите на эту дополнительную информацию о Ninject Binding

Ninject Binding

нормально, в вашем случае вам нужно это сделать (не проверено).Пока вы говорите Inject о конкретных значениях, он будет заботиться о внедрении в нужных вам местах, в зависимости от того, есть ли в вашем коде правильные атрибуты ввода.

  class MyBindings : NinjectModule
        {
            public override void Load()
            {
                Bind<IMediaPresenter>().To<MediaPresenter>;
                Bind<IDao>().To<Dao>();
                Bind<IBook>().To<Book>();
            }
        }
0 голосов
/ 26 августа 2011

почему бы не сделать это в нагрузке:

Bind<Dao<Book>>.ToSelf();
...