【问题标题】:Injection using NInject in ISiteMapNodeVisibilityProvider在 ISiteMapNodeVisibilityProvider 中使用 NInject 进行注入
【发布时间】:2013-01-21 07:01:41
【问题描述】:

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

我正在使用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。有什么建议么?我接受任何类型的指示,包括摆脱注射并另辟蹊径。

【问题讨论】:

  • ninject内核如何创建AreaSiteMapNodeVisibilityProvider?

标签: asp.net-mvc-3 ninject mvcsitemapprovider


【解决方案1】:

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

解决问题的选项:

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

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

2) 阅读R。 Gloor 对类似问题的回答:MVC3, Ninject, MvcSiteMapProvider - How to inject dependency to overridden method 并按照他的方式行事。

【讨论】:

  • 好吧,我再次回顾了最初用于架构的结构,你知道吗,上面提到的“反实践”的使用是在一个特定的方法实现中到位的.因此,我在那里插入了所需的绑定,并使用 User 对象在我的命令链中向下传播信息。因此,我将其标记为准确的答案,并提到波纹管的响应也非常有用。谢谢你们。
【解决方案2】:

确保

  1. siteMapNodeVisibilityProvider 在 web.config 中配置
  2. ISiteMapNodeVisibilityProvider 的绑定

【讨论】:

  • 请在 1 上开发。谢谢。
  • 我的意思是,你能让我从 web.config 中完全删除它吗?以后还能用吗?
  • 查看 MvcSiteMapProvider 源代码:当它在 web.config 中配置时,Ninject 绑定被忽略。
  • 感谢您的提醒!我将在一个单独的项目中进行更深入的研究,看看这是如何出现的,然后回复你。干杯!
猜你喜欢
  • 1970-01-01
  • 2012-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多