我有管理用户帐户的WebApi控制器。控制器有3个方法:构造函数 - 获取类型UserManager<IdentityUser>
的参数,由ninject自动注入。
Dispose
- 处理UserManager。
Register
行动 - 注册新用户。
我在Register
操作和Dispose
方法中设置了断点。
注意:使用ajax调用Register
操作。
NinjectWebCommon.cs
kernel.Bind<UserManager<IdentityUser>>().ToConstant(Startup.UserManager);
AccountController.cs
private readonly UserManager<IdentityUser> _userManager;
public AccountController(UserManager<IdentityUser> userManager)
{
_userManager = userManager;
}
[Route("api/Account/Register")]
public async Task<IHttpActionResult> Register(RegisterBindingModel model)
{ // **<---- Breakpoint**
// code...
}
protected override void Dispose(bool disposing)
{ // **<---- Breakpoint**
if (disposing)
{
_userManager.Dispose();
}
base.Dispose(disposing);
}
按F5(开始调试)后,Dispose
方法中的断点首先出现。然后我填写表单并将请求发送到Register
操作,其中的断点点击。
问题是UserManager
在操作发生之前就已经处理好了,如何修复代码以便UserManager在应用程序停止后处理?
答案 0 :(得分:3)
当你在控制器中处理静态对象(处理每个请求)时,在下一个请求中,你将无法在第二个请求中使用该对象。
此外,无需使用InSingletonScope
或ToConstant
处置绑定的对象,因为它们由Ninject
自动处理。
如果要为对象创建一个实例,则应使用InSingletonScope
或ToConstant
对其进行绑定(如Ninject wiki中所述),然后在放置内核时处理对象。其他方式每次注入绑定时,都会创建对象的新实例。
以下是代码的固定版本:
<强> NinjectWebCommon.cs 强>
kernel.Bind<UserManager<IdentityUser>>().ToConstant(Startup.UserManager); // Disposed when the kernel is disposed
<强> AccountController.cs 强>
private readonly UserManager<IdentityUser> _userManager;
public AccountController(UserManager<IdentityUser> userManager)
{
_userManager = userManager;
}
[Route("api/Account/Register")]
public async Task<IHttpActionResult> Register(RegisterBindingModel model)
{
// code...
}
答案 1 :(得分:2)
控制器被实例化并在每个请求上处理。如果您将单件传递给ctor,然后在控制器处理时丢弃单件,那么您将无法在第二次请求时使用单件。
为什么不在一些全局应用程序关闭事件上配置Startup.UserManager?