Выполняется одно действие, требующее создания экземпляра репозитория или исключения NullReferenceException - PullRequest
0 голосов
/ 25 октября 2011

В настоящее время у меня есть контроллер с несколькими действиями, но я столкнулся с проблемой с одним действием, которое, по-видимому, требует создания экземпляра хранилища в самом действии, иначе я получаю исключение NullReferenceException во время выполнения - действиеСамо собой, похоже, не отличается от других действий в контроллере.Это то, что у меня есть до сих пор:

    public class PatentController : Controller
    {
        IRepositoryExtension patentRepository;

        public PatentController()
        {
            PatentRepository patentRepository = new Proj.Data.PatentRepository();
        }

        //Constructor for unit test project
        public PatentController(IRepositoryExtension repository)
        {
            patentRepository = repository;
        }

        public ActionResult Index()
        {
            return View();
        }

        //Other actions removed for brevity

        public ActionResult DetailsPartial(string id)
        {
            //If this PatentRepository is removed, NullReferenceException occurs
            PatentRepository patentRepository = new Proj.Data.PatentRepository();
            USPTOPatent usptoPatent = patentRepository.GetPatent(id);
            return PartialView("DetailsPartial", usptoPatent);
        }

Есть ли какая-то особая причина, по которой мне нужно создать экземпляр хранилища в действии, чтобы он работал?Это ошибка, которую я получаю, если закомментирую ее:

Ссылка на объект не установлена ​​на экземпляр объекта.

Описание: во время выполнения текущего возникло необработанное исключениевеб-запрос.Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Сведения об исключении: System.NullReferenceException: ссылка на объект не установлена ​​для экземпляра объекта.

Ошибка источника:

Строка 155: // PatentRepositoryatentRepository = new Proj.Data.PatentRepository ();Строка 156: USPTOPatent usptoPatent =atentRepository.GetPatent (id);Строка 157:
return PartialView («DetailsPartial», usptoPatent);Строка 158:}

Ответы [ 2 ]

4 голосов
/ 25 октября 2011

Ваш конструктор по умолчанию присваивает результат new локальной переменной, которая будет иметь приоритет над объявленной в области видимости класса.Поэтому, когда контроллер создается таким образом, переменная-член parentRepository не была инициализирована.

Измените ctor по умолчанию на:

 public PatentController()
    {
        /*PatentRepository*/ patentRepository = new Proj.Data.PatentRepository();
    }
1 голос
/ 25 октября 2011

Является ли GetPatent() статическим методом, который возвращает экземпляр USPTOPatent?Похоже, что этот метод не является статическим.

Если метод не является статическим, для использования объекта необходимо создать его экземпляр.

См .: Элементы Static и Instance .

Если метод статический, убедитесь, что он возвращает объект по всем путям кода.

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