3

我想用一个惰性求值的参数绑定我的控制器。

 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 对象中没有请求上下文。我怎样才能发送它?

4

2 回答 2

1

我对 Ninject 并不太熟悉,但您应该能够向容器注册提供程序,以便能够解析HttpContextBase. 通过这样做,IFilesRepository现在可以将 aHttpContextBase作为构造函数参数,在创建IFilesRepository.

要注册提供者(使用委托来解析服务),

Bind<HttpContextBase>().ToMethod(context => new HttpContextWrapper(HttpContext.Current));

但是请注意,一个人的生活方式IFilesRepository很可能需要更改为“按 Web 请求”的生活方式,因为它HttpContext.Current是按 Web 请求创建的,因此您不希望在IFilesRepository具有更长生活方式。您可能希望抽象出“映射路径”功能,以便您可以拥有IFilesRepository更长的生活方式。

于 2011-10-20T10:16:39.553 回答
0

由于服务器变量与当前 HttpContext 相关,因此您必须在 FilesManager 类中检索它(如果您愿意,请为此目的使用单独的接口)

于 2011-10-20T10:13:56.597 回答