Ninject Scope issue with Tasks/Threads

前端 未结 2 1659
失恋的感觉
失恋的感觉 2020-12-20 16:46

I have an MVC3 project that uses Ninject, Entity Framework and the Unit of Work pattern with a Service layer.

My AsyncService class has a function that starts a back

相关标签:
2条回答
  • 2020-12-20 17:16

    This is a messy solution that I've used in the past using the ChildKernel plugin (I think Named scope would much cleaner). Basically I create a child kernel, and scope everything pertaining to the UoW as singleton in the child kernel. I then create a new child kernel for each Task, handle the UoW, and commit or rollback.

    IAsyncTask is an interface with 1 method, 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;
    }
    
    0 讨论(0)
  • 2020-12-20 17:36

    InRequestScope'd objects are Disposed at the end of a request so it can't be used in this case. InThreadScope also doesn't fit as that would reuse the UoW for several tasks.

    What you can do though is declare your AsyncService as the Scoping Object for all the objects within using the NamedScope extension.

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

    0 讨论(0)
提交回复
热议问题