Ninject范围的问题与任务/线程(Ninject Scope issue with Tasks/

2019-06-24 13:45发布

我有一个使用Ninject,实体框架和工作模式的单位与服务层的MVC3项目。

我AsyncService类有启动一个后台任务,作为一个例子,将用户添加到用户资料库的功能。 我现在的问题是,我才得到了的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...
    }
}

Answer 1:

InRequestScope “d对象Dispose在请求结束d,因此它不能在这种情况下被使用。 InThreadScope也不适合,因为这将重用UOW几个任务。

什么可以做,虽然是声明你AsyncService的范围界定对象范围内使用NamedScope扩展的所有对象。

见http://www.planetgeek.ch/2010/12/08/how-to-use-the-additional-ninject-scopes-of-namedscope/



Answer 2:

这是我在过去使用ChildKernel插件使用的凌乱的解决方案(我想命名的范围将更加清洁)。 基本上我创建一个子内核和范围都属于该UOW作为孩子内核单。 然后,我为每一个任务一个新的子内核,处理UOW,并提交或回滚。

IAsyncTask是具有1种方法的接口, Execute()

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;
}


文章来源: Ninject Scope issue with Tasks/Threads