【发布时间】: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