asp.net-mvc-3ninjectmvcsitemapprovider

Injection using NInject in ISiteMapNodeVisibilityProvider


I have a small problem which, hopefully, you will help me put behind.

I am using a MvcSiteMapProvider, and I want to define visibility for each node using access to a DB via a service interface.

 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"])
        
    }
}

However, my _SecurityService member is always null. Any suggestions? I accept any type of directions, including getting rid of my injection and going another way.


Solution

  • Your ISecurityService is null, because in this case, Ninject is not managing the creation of MvcSiteMapProvider (in MVC app, Ninject resolves dependencies wired from controller root, because it manages the creation of controllers - it overrides the default method for creation controllers).

    Options to resolve your issue:

    1) Use Ninject as service locator. Not recommended!, as it is widely considered to be an anti-pattern (but it depends...).

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

    2) Read R. Gloor's answer on similar question: MVC3, Ninject, MvcSiteMapProvider - How to inject dependency to overridden method and do it his way.