构造函数不一致地调用

时间:2011-08-03 07:45:29

标签: c# asp.net-mvc

我有一个控制器,它继承自一个抽象的安全控制器,它控制着一个如下的用户对象。

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;
    }
  }

2 个答案:

答案 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后,需要重新运行代码生成模板以反映更改。

构造函数现在按预期启动。