Ninject作用域与任务/线程问题

8

我有一个使用Ninject、Entity Framework和Unit of Work模式的MVC3项目,其中还包含一个Service层。

我的AsyncService类有一个函数,可以启动一个后台任务,例如将用户添加到User repository中。 我目前的问题是,该任务只能在几秒钟内正确运行,然后就会出现一个错误,指出DbContext已被释放。 我的数据库上下文(由Ninject的InRequestScope()注入)似乎正在被释放,因为InRequestScope()将其绑定到HttpContext。

我已经了解了InThreadScope(),但是我不确定如何在我的MVC项目中正确实现它。

我的问题是:在我的任务中正确使用Ninject的方法是什么?

public class AsyncService
{
    private CancellationTokenSource cancellationTokenSource;
    private IUnitOfWork _uow;
    public AsyncService(IUnitOfWork uow)
    {
        _uow = uow;
    }
    public void AsyncStartActivity(Activity activity)
    {
    ...snip...
        this.cancellationTokenSource = new CancellationTokenSource();
        var cancellationToken = this.cancellationTokenSource.Token;
        var task = Task.Factory.StartNew(() =>
            {
                foreach (var user in activity.UserList)
                {
                    this._uow.UserRepository.Add(new User() {UserID = user});
                }
                this._uow.Save();
            }, cancellationToken);
     ...snip...
    }
}
2个回答

5

3
有示例代码吗?Jason,你能让它正常工作吗?我遇到了同样的问题,跟着链接也没帮助。 - Joao Leme
我也遇到了同样的问题,很想看看这种情况下的示例代码。 - Shawn Mclean

0
这是我过去使用ChildKernel插件的一个混乱解决方案(我认为命名范围会更清晰)。基本上,我创建了一个子内核,并将与UoW相关的所有内容作为子内核中的单例进行范围限定。然后,我为每个任务创建一个新的子内核,处理UoW并提交或回滚。 是一个具有1个方法的接口

private Task void ExecuteTask<T>() where T:IAsyncTask
{

        var task = Task.Factory.StartNew(() =>
                                             {
            var taskKernel = _kernel.Get<ChildKernel>();
            var uow = taskKernel.Get<IUnitOfWork>();
            var asyncTask = taskKernel.Get<T>();

            try
            {
                uow.Begin();
                asyncTask.Execute();
                uow.Commit();
            }
            catch (Exception ex)
            {
                uow.Rollback();
                //log it, whatever else you want to do
            }
            finally
            {
                uow.Dispose();
                taskKernel.Dispose();
            }
      });
      return task;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接