我想用一个惰性求值的参数绑定(bind)我的 Controller 。
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
try
{
return controllerType == null
? null
: (IController) _ninjectKernel.Get(controllerType);
}
catch (Exception ex)
{
throw;
}
}
我有下一个绑定(bind):
_ninjectKernel.Bind<IFilesRepository>().To<FilesManager>().WithConstructorArgument("storageFolderAbsolutePath", c => c.ToString());
问题出在 lambda 函数上。我想返回 Server.MapPath("/") ...但我在 c 对象中没有请求上下文。我怎样才能发送它?
最佳答案
我对 Ninject 并不太熟悉,但是您应该能够在容器中注册一个提供程序,以便能够解析 HttpContextBase
。 .通过这样做,IFilesRepository
现在可以采取HttpContextBase
作为构造函数参数,在创建 IFilesRepository
的实例时,将由容器使用提供程序注入(inject).
要注册提供者(使用委托(delegate)来解析服务),
Bind<HttpContextBase>().ToMethod(context => new HttpContextWrapper(HttpContext.Current));
但是请注意,
IFilesRepository
的生活方式很可能需要更改为“按 Web 请求”的生活方式,如 HttpContext.Current
是根据 Web 请求创建的,因此您不想在 IFilesRepository
中保留它有更长的生活方式。您可能想要抽象出“映射路径”功能,以便您可以拥有 IFilesRepository
拥有更长的生活方式。
关于asp.net-mvc - MVC 3 ninject 绑定(bind)惰性评估参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7834203/