我有一个控制器,它继承自一个抽象的安全控制器,它控制着一个如下的用户对象。
public new User User
{
get
{
if (this.user == null)
{
var id = int.Parse(base.User.Identity.Name, CultureInfo.InvariantCulture);
this.user = this.UserRepository.FindById(id);
}
return this.user;
}
}
每次调用以下函数时,都会收到上述this.UserRepository的空异常
[UrlRoute(Path = "api/stats/events/visits/accounttype/{idList}")]
[UrlRoute(Path = "api/{idList}/stats/events/visits/accounttype")]
[UrlRouteParameterDefault(Name = "idList", Value = "")]
public virtual ActionResult Vsat(string idList, DateTime? startDate, DateTime? endDate)
{
// get the ids from the url and retrieve a list of events for those user/s
var ids = (from id in idList.Split(',') where !string.IsNullOrEmpty(id) select Convert.ToInt64(id)).ToList();
var allEvents = this.eventRepository.FindForCompanyBetweenDatesForUsers(
this.User.Company.Id, new List<EventType> { EventType.Visit }, startDate, endDate, ids).ToList();
var groupResults = allEvents.GroupBy(x => x.Account.AccountType.Name);
return null;
}
即使我的Api构造函数像这样调用安全控制器的基本构造函数
public ApiController(IUserRepository userRepository) : base(userRepository)
{
}
protected SecureController(IUserRepository userRepository)
{
this.UserRepository = userRepository;
}
更奇怪的是页面上还有其他函数引用this.User并且它们都没有返回null相同的异常。他们点击了安全构造函数,然后是api构造函数,然后是函数。 上面的Vsat函数(仅出于测试目的命名)命中函数,然后在行
中断this.user = this.UserRepository.FindById(id);
除此之外,如果我在上面放置一个类似的函数,它可以工作,但新函数会有同样的问题。
修改
创建了一个新类,该函数完美运行。
public class TestController : SecureController
{
private readonly IEventRepository eventRepository;
public TestController(IUserRepository userRepository, IEventRepository eventRepository) : base(userRepository)
{
this.eventRepository = eventRepository;
}
[UrlRoute(Path = "test/stats/events/visits/accounttype/{idList}")]
[UrlRoute(Path = "test/{idList}/stats/events/visits/accounttype")]
[UrlRouteParameterDefault(Name = "idList", Value = "")]
public virtual ActionResult Vsat(string idList, DateTime? startDate, DateTime? endDate)
{
// get the ids from the url and retrieve a list of events for those user/s
var ids = (from id in idList.Split(',') where !string.IsNullOrEmpty(id) select Convert.ToInt64(id)).ToList();
var allEvents = this.eventRepository.FindForCompanyBetweenDatesForUsers(
this.User.Company.Id, new List<EventType> {EventType.Visit}, startDate, endDate, ids).ToList();
var groupResults = allEvents.GroupBy(x => x.Account.AccountType.Name);
return null;
}
}
答案 0 :(得分:3)
我不确定是否有足够的代码可以准确了解问题的确切位置,但我注意到您的User
属性使用new
关键字来隐藏其下方的属性。这只有在调用代码使用对ApiController
的引用时才会起作用(我假设这是具有new User
属性的类型?)。
如果您的代码使用SecureController
并尝试访问User
,则不会触及您在this.user
周围实施的空检查代码。
对于不一致的构造函数调用,我可以说如果你是new
一个对象,将调用继承路径上的所有相关构造函数,除非抛出异常。
请点击此处查看使用new
关键字会员隐藏的概述,以及相关的陷阱:
更新:我怀疑Ninject正在玩你的物体寿命傻傻的玩家。无论是那个还是建筑都像这样做一些时髦的事情:
How does WCF deserialization instantiate objects without calling a constructor?
我会说断点是你的基类构造函数,并确保提供的对象不为null。没有看到任何更多的代码,很难回答。尝试创建另一个问题,但更多地关注Ninject可能是问题的根源。
答案 1 :(得分:2)
对于这种混淆感到抱歉,事实证明问题是由t4mvc模板引起的。
更改ApiController后,需要重新运行代码生成模板以反映更改。
构造函数现在按预期启动。