我希望用一个惰性求值的参数绑定我的控制器。
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对象中的请求上下文。我怎么发送它?
答案 0 :(得分:1)
我对Ninject并不太熟悉,但您应该能够在容器中注册一个提供程序,以便能够解析HttpContextBase
。通过这样做,IFilesRepository
现在可以将HttpContextBase
作为构造函数参数,在创建IFilesRepository
的实例时,将使用提供程序由容器注入。
注册提供者(使用代理来解析服务),
Bind<HttpContextBase>().ToMethod(context => new HttpContextWrapper(HttpContext.Current));
请注意,IFilesRepository
的生活方式很可能需要更改为“每个Web请求”的生活方式,因为HttpContext.Current
是根据网络请求创建的,所以你不会'我想在IFilesRepository
生活方式较长的时候坚持下去。您可能希望抽象出“映射路径”功能,以便IFilesRepository
拥有更长的生活方式。
答案 1 :(得分:0)
由于服务器变量与当前的HttpContext相关,因此您必须在FilesManager类中检索它(如果愿意,可以使用单独的接口)