Parâmetro de avaliação lenta MVC 3 ninject bind
-
27-10-2019 - |
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?
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)