Вопрос по asp.net-mvc-3, ninject, entity-framework-4 – Проблема Ninject Scope с задачами / потоками

8

У меня есть проект MVC3, который использует Ninject, Entity Framework и шаблон Unit of Work со слоем Service.

Мой класс AsyncService имеет функцию, которая запускает фоновую задачу, которая, например, добавляет пользователей в репозиторий User. Моя текущая проблема заключается в том, что задача выполняется правильно только в течение нескольких секунд, прежде чем я получаю сообщение об ошибке DbContext. Мой контекст базы данных, который внедряется с помощью InRequestScope () Ninject, кажется, удаляется, так как 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

InRequestScope объекты были быDisposed в конце запроса, поэтому его нельзя использовать в этом случае.InThreadScope также не подходит, так как это будет использовать UoW для нескольких задач.

Что ты можешь сделать, так это объявить свойAsyncService в качестве объекта области видимости для всех объектов, использующих расширение NamedScope.

Видетьhttp: //www.planetgeek.ch/2010/12/08/how-to-use-the-additional-ninject-scopes-of-namedscope

Есть ли пример кода? Джейсон, где ты смог заставить его работать? У меня та же проблема, и переход по ссылке не помог. Joao Leme
У меня такая же проблема, я хотел бы увидеть пример кода для этого сценария. Shawn Mclean
0

которое я использовал в прошлом с помощью плагина ChildKernel (я думаю, что Named scope будет намного чище). По сути, я создаю дочернее ядро и определяю все, что касается 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;
}

Похожие вопросы