MVC 3 - привязанный ленивый оцененный параметр - PullRequest
3 голосов
/ 20 октября 2011

Я хочу связать свой контроллер с параметром, который вычисляется лениво.

 protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {
        try
        {
            return controllerType == null
                       ? null
                       : (IController) _ninjectKernel.Get(controllerType);
        }
        catch (Exception ex)
        {
            throw;
        }
    }

И у меня следующая привязка:

_ninjectKernel.Bind<IFilesRepository>().To<FilesManager>().WithConstructorArgument("storageFolderAbsolutePath", c => c.ToString());

Проблема в лямбда-функции.Я хочу вернуть Server.MapPath ("/") ... но у меня нет контекста запроса в объекте c.Как я могу отправить его?

Ответы [ 2 ]

1 голос
/ 20 октября 2011

Я не слишком знаком с Ninject, но вы должны иметь возможность зарегистрировать провайдера в контейнере, чтобы иметь возможность разрешить HttpContextBase. Таким образом, IFilesRepository теперь может принимать HttpContextBase в качестве аргумента конструктора, который будет введен контейнером с помощью провайдера при создании экземпляра IFilesRepository.

.

Чтобы зарегистрировать провайдера (используя делегата для разрешения услуги),

Bind<HttpContextBase>().ToMethod(context => new HttpContextWrapper(HttpContext.Current));

Имейте в виду, однако, что стиль жизни IFilesRepository, скорее всего, нужно будет изменить на стиль жизни «по веб-запросу», так как HttpContext.Current создается для веб-запроса, поэтому вы не захотите держась за это в IFilesRepository, у которого был более длинный образ жизни. Возможно, вы захотите абстрагироваться от функции «отображения путей», чтобы у вас был IFilesRepository с более продолжительным образом жизни.

0 голосов
/ 20 октября 2011

Поскольку переменная сервера связана с текущим HttpContext, вам нужно будет извлечь его из класса FilesManager (если хотите, с помощью отдельного интерфейса)

...