需要实例化存储库或NullReferenceException的单个操作

时间:2011-10-25 14:25:23

标签: c# asp.net-mvc asp.net-mvc-3

我目前有一个带有多个动作的控制器,但我遇到了一个问题,单个动作似乎需要在动作本身内实例化存储库,否则我在运行时得到一个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行:// PatentRepository patentRepository = new   Proj.Data.PatentRepository();第156行:USPTOPatent   usptoPatent = patentRepository.GetPatent(id);第157行:
  返回PartialView(“DetailsPartial”,usptoPatent);第158行:}

2 个答案:

答案 0 :(得分:4)

您的默认构造函数将new的结果分配给局部变量,该变量优先于在类范围内声明的变量。因此,以这种方式创建控制器时,成员变量parentRepository尚未初始化。

将默认ctor更改为:

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

答案 1 :(得分:1)

GetPatent()是一个返回USPTOPatent实例的静态方法吗?看起来这种方法不是静态的。

如果方法不是静态的,则需要实例化对象以供使用。

请参阅:Static and Instance Members

如果方法是静态的,请确保它在所有代码路径上返回一个对象。