Использование шаблона MvcSiteMapProvider + DI + Repository = объект репозитория имеет значение null

В моем приложении у меня есть реестр проектов. Для доступа к этим проектам используется URL: /project/{url-project}

the value of `{url-project}` is defined in the registration of the project!

Я использую этот проект для создания пути, но, поскольку "зарегистрировать проект" является динамическим, пришлось реализовать его вручную. как показано в этой статье.

Я так и сделал:

public class ProjectDetailsDynamicNodeProvider : DynamicNodeProviderBase
{
    [Inject]
    public IProjectRepository ProjectRepository { get; set; }

    #region Overrides of DynamicNodeProviderBase

    public override IEnumerable<DynamicNode> GetDynamicNodeCollection()
    {
        // Build value 
        var returnValue = new List<DynamicNode>();
        var listDB = (from p in ProjectRepository.Query()
                      select new { p.Name, p.ID });

        // Create a node for each album 
        foreach (var project in listDB.ToList())
        {
            var node = new DynamicNode { Title = project.Name };
            node.RouteValues.Add("id", project.ID);

            returnValue.Add(node);
        }

        // Return 
        return returnValue;
    }

    #endregion
}

В моем Mvc.sitemap

<mvcSiteMapNode title="Projetos" controller="Project" action="Index">
  <mvcSiteMapNode title="Novo Projeto" controller="Project" action="Create" />
  <mvcSiteMapNode title="Projeto" action="About" dynamicNodeProvider="BindSolution.Infra.ProjectDetailsDynamicNodeProvider, BindSolution" />
</mvcSiteMapNode>

Проблема

Моя проблема ProjectRepository, которая всегда равна нулю!

kernel.Bind<IProjectRepository>().To<ProjectRepository>().InRequestScope();

Но в моей настройке Ninject работает правильно! Этот репозиторий используется в контроллере и работает отлично!

Попытки

Я попытался внедрить эту зависимость через конструктор, но результат был тот же!

public class ProjectDetailsDynamicNodeProvider : DynamicNodeProviderBase
{
    public IProjectRepository ProjectRepository { get; set; }

    public ProjectDetailsDynamicNodeProvider(IProjectRepository projectRepository)
    {
        ProjectRepository = projectRepository
    }

    #region Overrides of DynamicNodeProviderBase

    public override IEnumerable<DynamicNode> GetDynamicNodeCollection()
    {
        // Build value 
        var returnValue = new List<DynamicNode>();
        var listDB = (from p in ProjectRepository.Query()
                      select new { p.Name, p.ID });

        // Create a node for each album 
        foreach (var project in listDB.ToList())
        {
            var node = new DynamicNode { Title = project.Name };
            node.RouteValues.Add("id", project.ID);

            returnValue.Add(node);
        }

        // Return 
        return returnValue;
    }

    #endregion
}

comment
Как настроить контроллеры для использования Ninject?   -  person Drew Freyling    schedule 09.01.2012


Ответы (1)


Я считаю, что этот вопрос похож на ваш: MVC3, Ninject, MvcSiteMapProvider — как внедрить зависимость в переопределенный метод

Это означает, что в основном у вас нет хорошего решения.

person Moshe    schedule 18.04.2012