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
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;
}
InRequestScope
'd objects are Dispose
d 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/