MVC 3 ninject绑定惰性评估参数



我想绑定我的控制器与一个参数是延迟评估。

 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类中检索它(如果您愿意,可以使用单独的接口)

最新更新