.NET WebApi在操作之前命中dispose

时间:2014-01-01 10:08:31

标签: asp.net-mvc asp.net-mvc-4 asp.net-web-api

我有管理用户帐户的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在应用程序停止后处理?

2 个答案:

答案 0 :(得分:3)

当你在控制器中处理静态对象(处理每个请求)时,在下一个请求中,你将无法在第二个请求中使用该对象。

此外,无需使用InSingletonScopeToConstant处置绑定的对象,因为它们由Ninject自动处理。 如果要为对象创建一个实例,则应使用InSingletonScopeToConstant对其进行绑定(如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?