2012-06-12 1 views
1

этот вопрос Ninject Dependency Injection in MVC3 - Outside of a Controller близок к тому, что я испытываю, но не совсем.HttpContext имеет значение null при вызове Ninject за пределами контроллера MVC3

У меня есть сайт ASP.NET MVC3 с использованием Ninject 3, и он прекрасно работает с инжектором конструктора. Все мои зависимости разрешены, в том числе те, которые проходят в HttpContext.Current.

Моя проблема в том, что в global.asax я запускаю класс TaskManager, который периодически выполняет некоторые задачи по таймеру. Внутри класса TaskManager, у меня нет контроллеров, так что если мне нужен доступ к одному из моих зависимостей (например, моей службы регистрации ошибок), я использую статический класс-оболочку, которая имеет доступ к объекту ядра:

var logger = MyContainer.Get<ILoggingService>(); 
logger.Error("error doing something...", ex); 

Метод .Get просто выполняет вызов kernel.Get, разрешающий мою зависимость. Отлично работает каждый раз, когда я использую этот метод для других моих зависимостей. Однако ILoggingService имеет зависимость MyWebHelper, которая вводится через его конструктор и включает HttpContext в свой конструктор.

public class DefaultLogger : ILoggingService 
    {  
     public DefaultLogger(IRepository<Log> logRepository, IWebHelper webHelper) 
     { 
      _logRepository = logRepository; 
      _webHelper = webHelper; 
     } 
    } 

    public class MyWebHelper : IWebHelper 
    { 
     public MyWebHelper(HttpContext httpContext) 
     { 
      _httpContext = httpContext; 
     } 
    } 

В остальной части моего веб-сайта, все это прекрасно работает, потому что все зависимости впрыскивают в мои MVC контроллеры. Но что не получается, если я вручную вызову мой статический класс-оболочку, чтобы получить мои зависимости таким образом. Я получаю ошибку:

Error activating HttpContext using binding from HttpContext to method

Provider returned null.

Таким образом, это не дает мне HttpContext, как это делает на протяжении всего моего приложения MVC. Я надеюсь, что это имеет смысл, я не Ninject эксперт, но я пытаюсь ...

ответ

3

My issue is that in global.asax, I kick off a TaskManager class that periodically performs some tasks on a timer.

Это плохая идея, так как Фил Хаака explains in details. Не делайте этого в своем веб-приложении. Эти повторяющиеся задачи должны выполняться в отдельном приложении (служба Windows или какое-то консольное приложение, которое планируется запустить через определенные промежутки времени).

Теперь дело в том, что вы используете потоки фона. Эти фоновые потоки выполняются за пределами любого пользовательского HTTP-запроса и, как следствие, HttpContext.Current, очевидно, является нулевым. Поэтому, даже если вы не следуете советам Фила Хаака и продолжаете выполнять фоновые задачи в своем приложении ASP.NET, вам придется перестроить свой метод, чтобы он больше не зависел ни от какого HttpContext, потому что в этих фоновых потоках нет такой вещи.

+0

Благодарим вас за сообщение! Задачи, которые я выполняю, - это в основном задачи типа очистки и отправка электронной почты, поставленных в очередь. NopCommerce делает что-то очень похожее, и я получил эту идею. Они очень короткие и простые. Я понимаю комментарий о HttpContext. Конечно, это не доступно :) Мой путь вокруг этого состоял в том, чтобы создать еще одну версию ILoggingService, у которой не было введенных зависимостей, включая HttpContext.Current. Было бы здорово, если бы он не просто взорвался, когда обнаружил нулевой HttpContext. – ScottG

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