1

我有一个小问题,希望你能帮我解决。

我正在使用MvcSiteMapProvider,并且我想使用通过服务接口访问数据库来定义每个节点的可见性。

 public class AreaSiteMapNodeVisibilityProvider : MvcSiteMapProvider.Extensibility.ISiteMapNodeVisibilityProvider
{   
[Inject]
public ISecurityService _SecurityService {get;set;}
        public AreaSiteMapNodeVisibilityProvider()
    {
        
    }
    public bool IsVisible(SiteMapNode node, HttpContext context, IDictionary<string, object> sourceMetadata)
    {
        MvcSiteMapNode thisNode = node as MvcSiteMapNode;
        return _SecurityService.CalculateNodeVisibility(thisNode,context.Cache["someValueIHaveStoredHere"])
        
    }
}

但是,我的_SecurityService会员始终是null. 有什么建议么?我接受任何类型的指示,包括摆脱注射并另辟蹊径。

4

2 回答 2

1

ISecurityServicenull,因为在这种情况下,Ninject 不管理创建(在 MVC 应用程序中,Ninject 解决了从控制器MvcSiteMapProvider连接的依赖项,因为它管理控制器的创建 - 它覆盖了创建控制器的默认方法)。

解决您的问题的选项:

1) 使用 Ninject 作为服务定位器。不建议!因为它被广泛认为是一种反模式(但这取决于......)

var app = HttpContext.ApplicationInstance as NinjectHttpApplication;
var service = app.Kernel.Get<ISecurityService>();

2)阅读R. Gloor对类似问题的回答:MVC3, Ninject, MvcSiteMapProvider - How to injection dependency to overridden method and do it in his way。

于 2013-01-21T09:29:00.963 回答
0

确保

  1. web.config 中未配置siteMapNodeVisibilityProvider
  2. 有一个绑定ISiteMapNodeVisibilityProvider
于 2013-01-21T09:42:25.293 回答