2012-06-25 2 views
4

У меня есть необходимость начать новый поток для долго работающей задачи (запись в хранилище документов, запуск повторного индекса и т. Д.).с помощью Ninject в новой теме

Я использую Ninject на веб-сайте ASP.Net MVC. По сути, я хочу создать новый поток из моего запроса Http, который инициализирует его собственные объекты, следя за тем, чтобы никакие соединения с базами данных и т. Д. Не использовались из запроса Http в новом потоке. Я не уверен, что использовать для создания потока или как настроить Ninject для повторного использования сеанса моей базы данных из контекста веб-запроса.

Ниже приводится основная диаграмма последовательности задачи

Я читал немного о названных областей в Ninject, но я не уверен, что если каким-либо образом, что это связано.

Ninject Thread Scope

Код для моего CommandProcessor, который будет порождать новый поток является:

public class CommandProcessor 
{ 
    private IKernel _serviceLocator; 

    public CommandProc(IKernel serviceLocator) 
    { 
     _serviceLocator = serviceLocator; 
    } 

    public void Process<TCommand>(TCommand command) where T : ICommand 
    { 
     var commandHandlers = _serviceLocator.Get<ICommandHandler<TCommand>>(); 

     foreach (var commandHandler in commandHandlers) 
     { 
      // I want this call to be asynchronous 
      commandHandler.Handle(command); 
     } 
    } 
} 

Спасибо заранее,

Хэмиш.

ответ

2

Когда вы икру ваш новый поток, создать новый контекст активации из Ninject использовать в теме:

 Thread thread = new Thread(new ThreadStart(() => 
      { 
       using (IActivationBlock activation = kernel.BeginBlock()) 
       { 
        var commandHandlers = activation.Get<ICommandHandler<TCommand>>(); 

        foreach (var commandHandler in commandHandlers) 
        { 
         commandHandler.Handle(command); 
        } 
       } 
      })); 
     thread.Start(); 
+0

Хм, это сделает контекст DB перейти из области запроса Web в переходных процессах обыкновению это? – Anders

Смежные вопросы