【问题标题】:parameter passed from constructor NRE ASP.NET从构造函数 NRE ASP.NET 传递的参数
【发布时间】:2019-03-13 14:39:29
【问题描述】:

我使用了 WebForms(旧版)+ ASP.NET MVC + SimpleInjector

public abstract class CustomBaseController : Controller
{
    protected User user;
    protected IAppDbContext repo;
    public CustomBaseController(User user, IAppDbContext repo)
    {
        this.user = user;
        this.repo = repo;
    }
}
// my controller
[MyCustomAuthorize]
public class MyCustomController : CustomBaseController
{
    public MyCustomController(User user, IAppDbContext repo) : base(user, repo)
    {
    }

    [HttpPost]
    public ActionResult PostMethod()
    {
        user.Name = "NewUserName"; // throw NullReferenceException that user is null
        // some logic
        // some logger
    }
}
// user entity
public class User
{
    public Guid Id { get; protected set; }
    public string Email { get; protected set; }
    public string DisplayName { get; protected set; }

    public string FirstName { get; protected set; }
    public string LastName { get; protected set; }

    // and other properties
}

// Register DI
private static void InitializeContainer()
{
    var container = new Container();
    container.Register<IUserSessionManagement, UserSessionManagement >(Lifestyle.Scoped);
    container.Register<User>(() => container.GetInstance<UserSessionManagement>().UserSession, Lifestyle.Scoped);
    DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
}

// Wrapper for User 
public class UserSessionManagement : IUserSessionManagement
{
    public User UserSession { get; }
    public UserSessionManagement(IAppDbContext repo)
    {
        UserSession = (HttpContext.Current.Session[SESSION_AUTHENTICATED_USER] as User) ?? new User(Guid.Empty, null, null);
    }
}
  • 基于 cookie 的授权。
  • SimpleInjector 解析所有依赖项和cannot null parameter。如果参数为 null,则在构造函数上时将引发异常。

我在 /PostMethod 请求中捕获 NullReferenceException(user 为空)。 我一直在寻找可以擦除参考的任何地方。没有什么。引用不能重写。看起来GC 已经清除了所有链接。

注意:我无法在调试中重现这一点。我从日志中知道了这个问题。

注意 1:MyCustomController 创建成功(user 不为空)。 发布请求以引发用户为空的期望。

【问题讨论】:

  • CustomBaseController 对参数做了什么?
  • @SLaks,已更新
  • 你所说的“丢失”参数是什么意思,我真的不明白这个问题?如果调试构造函数,user是否为空?您收到什么异常消息(如果有)?
  • 你在哪里将user注册为简单注入器中的依赖项?
  • 似乎User 是运行时数据,因为您正在更改PostMethod 方法内的Name 属性。如here 所述,运行时数据不应在组件构建期间注入到组件中。

标签: c# asp.net-mvc simple-injector


【解决方案1】:

看看这个答案Here

我们必须查看您的 CustomBaseController 才能看到更多信息。

public MyCustomController() : base()
{
}

你可能只需要一个无参数的构造函数。

【讨论】:

  • 尝试将您的用户对象设置到您的abstract class CustomBaseController 中的TempData["NameYourObjectHere"] = user; 中,看看它是否仍然存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-13
  • 1970-01-01
  • 1970-01-01
  • 2012-09-11
  • 2011-11-30
  • 2014-08-14
  • 1970-01-01
相关资源
最近更新 更多