Как передать HttpContext в инициализацию зависимостей в приложении MVC3 - PullRequest
4 голосов
/ 03 февраля 2012

Я использую Ninject в приложении MVC3.

Одна из моих разрешаемых зависимостей использует HttpContext.Current.Server.MapPath("~/App_Data")

Назад, когда я инициализировал контейнер IoC в Global.asax (Application_Start), я смог просто определить в конфигурации моего модуля:

.WithConstructorArgument("basePath", HttpContext.Current.Server.MapPath("~/App_Data"));

Поскольку мой модуль инициализировался из того же потока, что и приложение, HttContext.Current не был нулевым.

Затем мне пришлось перенести инициализацию внедрения зависимостей в метод PreAppStart, используя WebActivator. Так как HttContext еще не доступен в этом сценарии, мне пришлось удалить инициализацию параметров моего dep.

Я обошел проблему, решив HttpContext внутри экземпляра класса во время выполнения. Но оказывается, что это было возможно только до тех пор, пока экземпляр вызывался из потока запроса. Как только я переместил вызов разрешенного экземпляра в отдельный поток (чтобы не останавливать генерацию контроллеров ActionResult), я пришел к той же проблеме - больше не мог получить HttpContext. Как я могу решить это в моем сценарии?

P.S. Только что понял, что я все еще могу просто вызвать метод моей зависимости от запуска приложения Global.asax и передать оттуда HttpContext. Тем не менее, дайте мне знать, что является лучшим способом сделать это.

1 Ответ

1 голос
/ 03 февраля 2012

В Ninject должен быть способ ленивой регистрации зависимости с использованием делегата. Таким образом, он будет разрешен только при доступе к зависимости.

Вот как я это делаю, используя StructureMap:

For<HttpContextBase>().Use(c => new HttpContextWrapper(HttpContext.Current));

Для доступа к HttpContext из другого потока вы можете использовать метод AsyncManager.Sync (d), который принимает делегата и запускает его в рабочем процессе ASP .NET.

...