Экземпляр хранилища данных Null - NullReferenceException? В экземпляре объекта не задана ссылка на объект - PullRequest
0 голосов
/ 13 сентября 2018

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

Вот класс, который реализуетIArticleRepository интерфейс.

public class ArticleRepository : IArticleRepository
    {
        private readonly ApplicationDbContext dbContext;
        public ArticleRepository(ApplicationDbContext dbContext)
        {
            this.dbContext = dbContext;
        }

        public void DeleteArticle(int articleId)
        {
            throw new NotImplementedException();
        }

        public async Task<Article> GetArticleAsync(int articleId)
        {
            Article article = await dbContext.Articles.FirstOrDefaultAsync(x => x.Id == articleId);
            return article;
        }

        public async Task<IEnumerable<Article>> GetArticles()
        {
            var articles = await dbContext.Articles.ToListAsync();
            return articles;
        }

        public void InsertArticle(Article article)
        {
            dbContext.Articles.Add(article);
        }

        public async void Save()
        {
            await dbContext.SaveChangesAsync();
        }

        public void UpdateArticle(Article article)
        {
            throw new NotImplementedException();
        }
    }

В моем контроллере у меня есть:

private readonly ArticleRepository _ArticleRepo;

public ArticleController(){}

public ArticleController(ArticleRepository _ArticleRepo)
{
    this._ArticleRepo = _ArticleRepo;
}

Так что я создаю экземпляр экземпляра ArticleRepo (надеюсь, я сделал это правильно).

[HttpPost]
[Authorize]
[ValidateAntiForgeryToken]
public ActionResult New (Article article)
{
    try
    {
        if (ModelState.IsValid)
        {
            var userId = User.Identity.GetUserId();

            Article newArticle = new Article
            {
                Title = article.Title,
                Content = article.Content,
                AuthorId = userId,
                CreatedAt = DateTime.Now,
                LastUpdated = DateTime.Now
            };

            _ArticleRepo.InsertArticle(newArticle);
            _ArticleRepo.Save();

            return RedirectToAction("Details", "Article", new { id = article.Id });
        }
    } catch (DataException)
    {
        ModelState.AddModelError(string.Empty, "Unable to save changes. Try again, and if the problem persists contact your system administrator.");
    }

   return View(article);
}

Получение ошибки при нажатии _ArticleRepo.InsertArticle(newArticle);

1 Ответ

0 голосов
/ 14 сентября 2018

Удалите конструктор по умолчанию из вашего контроллера:

public ArticleController(){}

и это обрисует проблему. Пример, которому вы следуете, использует Dependency Injection, который является очень хорошим шаблоном для обучения. К сожалению, по умолчанию MVC ожидает, что контроллеры , а не будут иметь зависимости, хотя они предоставили хуки для размещения альтернативных фабрик контроллеров. Большинство IoC-контейнеров (Inversion of Control, которые идут рука об руку с Dependency Injection) поддерживают внедрение контроллера MVC.

Загляните в контейнер Autofac IoC, так как он довольно хорошо подходит для шаблона и прост в настройке / использовании, а также имеет довольно хорошую документацию.

https://autofaccn.readthedocs.io/en/latest/integration/mvc.html

В качестве альтернативы вы можете прочитать об Unity, Ninject, Castle Windsor или ряде других, но эти 4, возможно, самые распространенные, которые вы найдете в дикой природе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...