我想绑定我的控制器与一个参数是延迟评估。
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());
问题在于lambda函数。我想返回Server.MapPath("/")…但我在c对象中没有请求上下文。我怎么寄呢?
我不太熟悉Ninject,但是您应该能够向容器注册一个提供者,以便能够解析HttpContextBase
。通过这样做,IFilesRepository
现在可以将HttpContextBase
作为构造函数参数,当创建IFilesRepository
的实例时,该参数将由容器使用提供程序注入。
注册一个提供者(使用委托来解析服务),
Bind<HttpContextBase>().ToMethod(context => new HttpContextWrapper(HttpContext.Current));
请注意,IFilesRepository
的生活方式很可能需要更改为"每个Web请求"的生活方式,因为HttpContext.Current
是根据每个Web请求创建的,所以您不会想要在具有更长的生活方式的IFilesRepository
中坚持下去。您可能希望抽象出"映射路径"功能,以便您可以拥有具有更长的生活方式的IFilesRepository
。
由于服务器变量与当前HttpContext相关,因此您必须在FilesManager类中检索它(如果您愿意,可以使用单独的接口)