Pergunta

Eu quero ligar meu controlador com um parâmetro que é avaliado lentamente.

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

E eu tenho a próxima ligação:

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

O problema está na função lambda.Quero retornar Server.MapPath ("/") ... mas não tenho o contexto da solicitação no objeto c.Como posso enviar?

Foi útil?

Solução

Não estou muito familiarizado com o Ninject, mas você deve conseguir registrar um provedor com o contêiner para poder resolver um HttpContextBase.Ao fazer isso, o IFilesRepository agora pode receber um HttpContextBase como um argumento do construtor, que será injetado pelo contêiner, usando o provedor, ao criar uma instância de IFilesRepository.

Para registrar um provedor (usando um delegado para resolver o serviço),

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

Esteja ciente, entretanto, que o estilo de vida de um IFilesRepository provavelmente precisaria mudar para um estilo de vida "por solicitação da web", já que o HttpContext.Current é criado por solicitação da web, então você não gostaria de mantê-loum IFilesRepository que tinha um estilo de vida mais longo.Você pode querer abstrair a funcionalidade de "caminhos de mapeamento" para que possa ter um IFilesRepository com um estilo de vida mais longo.

Outras dicas

Já que a variável do servidor está relacionada ao HttpContext atual, você terá que recuperá-la dentro da classe FilesManager (usando uma interface separada para esse propósito, se quiser)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top