【发布时间】:2014-11-06 08:44:32
【问题描述】:
我们在 ASP.NET Web Api 应用程序中使用 Ninject,我们将 DbContext 与 InRequestScope 绑定。这适用于我们的大多数请求,因为它们同步完成所有工作,因此可以在请求完成后安全地释放上下文。
但是,我们根据请求执行异步 Web 服务调用,该调用具有作为回调传递的延续方法,并且该回调方法需要使用数据库上下文。但是我们的请求不应该等待异步服务调用完成,而是立即返回(这是一个明确的要求)。
这是一个简化的例子。
public class MyController : ApiController
{
private readonly MyDbContext dbContext;
private readonly SomeWebService service;
public MyController(MyDbContext dbContext, SomeWebService service)
{
this.dbContext = dbContext;
this.service = service;
}
public IHttpActionResult MyActionWithAsyncCall()
{
// Doing stuff.
// Calling webservice method, passing the Callback as the continuation.
service.MethodWithCallback(param1, param2, this.Callback);
// Returning without waiting for the service call to be completed.
return Ok();
}
private void Callback()
{
// Trying to use the DbContext:
var person = dbContext.People.First();
// The above line sometimes throws exception, because the context has been disposed.
}
}
Ninject 应该如何处理这种情况?有没有办法以某种方式显式地“延长”绑定 DbContext 实例的生命周期?或者回调方法应该创建全新的DbContext?如果应该,应该使用什么范围?
【问题讨论】:
-
听起来像是消息队列的工作。
标签: c# asp.net asp.net-web-api ninject