Ninject не может создать обьект

323
28 января 2017, 08:18

При попытке создать обьект через контейнер Ninject вылетает exception : Object reference not set to an instance of an object. Подскажите, пожалуйста, в чем может быть проблема?

Метод с класса 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
            _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 в другой.

Answer 1

Ошибка говорит о том, что в экземпляре объекта не задана ссылка на объект.

Object reference not set to an instance of an object.

В этих двух строчках

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

Вы "говорите" IoC-контейнеру, что при запросе IRepository<Tag> или Repository<Tag>, необходимо вернуть реализацию, но не указываете ее.

Правильным будет следующий вызов.

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

Вы сообщаете IoC-контейнеру, что при запросе IRepository<Tag> создать экземпляр класса Repository<Tag>. Для второй строки аналогично.

И ответ на вопрос из комментария:

для контекста делаю InRequestScope(), нужно ли мне это делать и для репозитория и для сервиса?

Для репозитория и Сервиса не нужно делать InRequestScope(), только для контекста BlogDbContext

UPD

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

Не важно, главное указать ссылка на сборку в которой лежит репозиторий и интерфейсы

READ ALSO
Помогите разобраться с ошибкой

Помогите разобраться с ошибкой

Есть объект, наследованный от IEnumerableStackOverflowException возникает в методе MoveNext этого класса, на строчке с Regex

311
автоматическое определение диапазона ip-адресов [требует правки]

автоматическое определение диапазона ip-адресов [требует правки]

Здравствуйте! Такая задача: ipconfig - автоматическое определение ip-адресов, как это реализовать на c#? Те

278
Сохранение Id с помощью Entity Framework

Сохранение Id с помощью Entity Framework

У меня есть EF 6x, несколько сущностей и с полем Id у каждой (типа Guid), которые сконфигурены как

325