MVC 3 ninject绑定延迟评估参数

时间:2011-10-20 09:57:38

标签: asp.net-mvc ninject ninject.web.mvc

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

 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对象中的请求上下文。我怎么发送它?

2 个答案:

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