我目前有一个带有多个动作的控制器,但我遇到了一个问题,单个动作似乎需要在动作本身内实例化存储库,否则我在运行时得到一个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行:}
答案 0 :(得分:4)
您的默认构造函数将new
的结果分配给局部变量,该变量优先于在类范围内声明的变量。因此,以这种方式创建控制器时,成员变量parentRepository
尚未初始化。
将默认ctor更改为:
public PatentController()
{
/*PatentRepository*/ patentRepository = new Proj.Data.PatentRepository();
}
答案 1 :(得分:1)
GetPatent()
是一个返回USPTOPatent
实例的静态方法吗?看起来这种方法不是静态的。
如果方法不是静态的,则需要实例化对象以供使用。
请参阅:Static and Instance Members。
如果方法是静态的,请确保它在所有代码路径上返回一个对象。